ʞɔı*_*ɔıu 9 mysql sql checksum
我想计算聚合列中所有值的校验和.
换句话说,我想做一些相当于
md5(group_concat(some_column))
Run Code Online (Sandbox Code Playgroud)
这种方法的问题是:
(如果你想知道,你可以确保值的连续符合一致的顺序,但是,不管你信不信,group_concat()接受其中的order by子句,例如group_concat(some_column order by some_column)
)
MySQL提供非标准的按位聚合函数BIT_AND(),BIT_OR()和BIT_XOR(),我认为这对这个问题很有用.在这种情况下,该列是数字,但我很想知道是否有一种方法可以使用字符串列.
对于此特定应用程序,校验和不必是安全的.
如果您不关心加密强度,似乎您也可以使用crc32
而不是md5
。我认为这:
select sum(crc32(some_column)) from some_table;
Run Code Online (Sandbox Code Playgroud)
将在字符串上工作。它可能效率低下,因为 MySQL 可能会创建一个临时表(特别是如果您添加了order by
)。
以下查询用于Percona的Mysql表校验和工具.它有点难以理解,但基本上它CRC32
是每一行的列(或一堆列连接),然后XOR
使用BIT_XOR
组函数将它们全部组合在一起.如果一个crc哈希值不同,那么XOR
所有内容的结果也会不同.这发生在固定内存中,因此您可以校验任意大的表.
SELECT CONV(BIT_XOR(CAST(CRC32(column) AS UNSIGNED)), 10, 16)
有一点要记住,虽然这不能防止可能的碰撞,并且CRC32
按照今天的标准是一个相当弱的功能.一个更好的散列函数就像是FNV_64
.当XOR
编辑在一起时,不太可能有两个相互补充的哈希.
归档时间: |
|
查看次数: |
5340 次 |
最近记录: |