当前位置:  开发笔记 > 后端 > 正文

创建列的聚合校验和

如何解决《创建列的聚合校验和》经验,为你挑选了1个好方法。

我想计算聚合列中所有值的校验和.

换句话说,我想做一些相当于

md5(group_concat(some_column))

这种方法的问题是:

    效率低下.在将列传递给md5函数之前,必须将列的所有值作为字符串连接在一些临时存储中

    group_concat的最大长度为1024,之后其他所有内容都将被截断.

(如果你想知道,你可以确保值的连续符合一致的顺序,但是,不管你信不信,group_concat()接受其中的order by子句,例如group_concat(some_column order by some_column))

MySQL提供非标准的按位聚合函数BIT_AND(),BIT_OR()和BIT_XOR(),我认为这对这个问题很有用.在这种情况下,该列是数字,但我很想知道是否有一种方法可以使用字符串列.

对于此特定应用程序,校验和不必是安全的.



1> Yarek T..:

以下查询用于Percona的Mysql表校验和工具.它有点难以理解,但基本上它CRC32是每一行的列(或一堆列连接),然后XOR使用BIT_XOR组函数将它们全部组合在一起.如果一个crc哈希值不同,那么XOR所有内容的结果也会不同.这发生在固定内存中,因此您可以校验任意大的表.

SELECT CONV(BIT_XOR(CAST(CRC32(column) AS UNSIGNED)), 10, 16)

有一点要记住,虽然这不能防止可能的碰撞,并且CRC32按照今天的标准是一个相当弱的功能.一个更好的散列函数就像是FNV_64.当XOR编辑在一起时,不太可能有两个相互补充的哈希.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有