我需要为表中的某些数据生成单个哈希
CREATE TABLE Table1
(
F1 INT UNSIGNED NOT NULL AUTO_INCREMENT,
F2 INT default NULL,
F3 Varchar(50) default NULL,
..
FN INT default NULL,
PRIMARY KEY (F1)
);
即。 F1,F3,FN,其中F2 = 10
SELECT md5(CONCAT_WS('#',F1,F3,FN)) FROM Tabe1 WHERE F2=10
为表格中的每一行提供一个哈希值。
问题
1)如何在整个表中获得单个哈希值?
2)什么是快速哈希算法使用MD5,SHA1,SHA或其他?
修改
已使用Mysql 4.1 - NOT 具有触发器支持
答案 0 :(得分:10)
1)
SELECT MD5( GROUP_CONCAT( CONCAT_WS('#',F1,F3,FN) SEPARATOR '##' ) ) FROM Table1
2)速度并不重要,因为函数必须只运行一次且所有哈希函数都足够快
答案 1 :(得分:6)
至于速度,你应该试试。这取决于功能的实现方式。
但是,很可能你会看到很小的速度差异。你引用的散列函数都比普通磁盘可以喷出的快,所以问题不在于“什么散列函数会使代码运行最快?”但是“什么哈希函数会在等待来自磁盘的数据时使CPU最空闲?”。在我的Intel Core2 Q6600上,主频为2.4 GHz(64位模式),使用我自己的散列函数C实现,我得到以下散列速度:
仅使用单核。我的硬盘最高可达100 MB / s,因此可以说即使使用SHA-256,散列过程也不会超过机器CPU功率的17%。当然,没有什么可以保证MySQL使用的实现是那么快,这就是你应该尝试的原因。此外,在32位模式下,SHA-512性能会下降很多。
在密码学上,在MD5和SHA-1中发现了(严重的)弱点,因此如果您在安全相关的设置中工作(即,即使有人可以选择某些更改,您也想要检测更改)我希望您不会检测到所述更改),您应该坚持使用SHA-256或SHA-512,据我们所知,它足够强大。不过,在非安全的情况下,MD5和SHA-1仍然很好。
答案 2 :(得分:3)
我会使用MySQL Trigger来检测插入,删除,更新等方面的更改
答案 3 :(得分:2)
虽然这个帖子很旧,但也许这就是你需要的: http://dev.mysql.com/doc/refman/5.0/en/checksum-table.html
答案 4 :(得分:1)
参见BIT_XOR: http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html “返回expr中所有位的按位异或。计算以64位(BIGINT)精度执行。如果没有匹配的行,则此函数返回0。” 有关使用示例,请检查pt-table-sync。
答案 5 :(得分:1)
如果由于任何原因您无法使用触发器,则另一种方法是使用CONCAT选项,例如:
SELECT MD5( GROUP_CONCAT( CONCAT_WS('',F1,F3,FN) SEPARATOR ',' ) ) FROM Table1;
但请注意,如果表中有大量数据,查询将会很慢!如果可能,尝试从CONCACT中排除不必要的列。
另请注意,默认情况下,MySQL Max CONCACT 1024 ,可能需要先运行以下查询来更改此内容:
SET group_concact_max_len = 18446744073709547520;
请注意 18446744073709547520 是最大值,您可以使用不同的值!