【发布时间】:2016-01-22 14:13:05
【问题描述】:
我可以在查询中使用值列表之前对其进行排序吗?
点赞SELECT SORTINGFN(2,3,1) 并获得1,2,3?
SELECT 2,3,1 ORDER BY ??? ASC 之类的东西,但按什么排序?
我需要确保参数的顺序始终相同,以便从 MD5('1,2,3') 和 MD5('2,3,1') 获得相同的哈希
【问题讨论】:
我可以在查询中使用值列表之前对其进行排序吗?
点赞SELECT SORTINGFN(2,3,1) 并获得1,2,3?
SELECT 2,3,1 ORDER BY ??? ASC 之类的东西,但按什么排序?
我需要确保参数的顺序始终相同,以便从 MD5('1,2,3') 和 MD5('2,3,1') 获得相同的哈希
【问题讨论】:
无表(为argx设置值):
SELECT arg1,arg2,arg3,
MD5(SELECT GROUP_CONCAT(col ORDER BY col)
FROM (SELECT arg1 AS col
UNION ALL SELECT arg2
UNION ALL SELECT arg3) AS sub) AS md5_checksum
输出:
╔════╦════╦════╦══════════════════════════════════╗
║ 1 ║ 2 ║ 3 ║ md5_checksum ║
╠════╬════╬════╬══════════════════════════════════╣
║ 1 ║ 2 ║ 3 ║ 55b84a9d317184fe61224bfb4a060fb0 ║
║ 3 ║ 2 ║ 1 ║ 55b84a9d317184fe61224bfb4a060fb0 ║
║ 3 ║ 1 ║ 2 ║ 55b84a9d317184fe61224bfb4a060fb0 ║
╚════╩════╩════╩══════════════════════════════════╝
反正MD5是弱哈希算法。
SQL 可以做很多事情。问题是这种操作的好地方,什么时候可以在应用层做。
任意列表:
SELECT MD5(GROUP_CONCAT(val ORDER BY val)) AS md5_sum
FROM (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.results, ',', n.n), ',', -1) AS val
FROM (SELECT '3,2,1,10,212,3123,1' AS results) AS t
CROSS JOIN
(
SELECT a.N + b.N * 10 + 1 n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
) n
WHERE n.n <= 1 + (LENGTH(t.results) - LENGTH(REPLACE(t.results, ',', '')))
) sub
输出:
╔══════════════════════╦══════════════════════════════════╗
║ args ║ md5_sum ║
╠══════════════════════╬══════════════════════════════════╣
║ 3,2,1,10,212,3123,1 ║ e2003296ed64cb59be61558275e22433 ║
║ 212,3123,1,3,2,1,10 ║ e2003296ed64cb59be61558275e22433 ║
╚══════════════════════╩══════════════════════════════════╝
【讨论】:
(SELECT arg1 AS col UNION ALL SELECT arg2 UNION ALL SELECT arg3 UNION ALL ...)