Mysql - 在表的一部分上使用散列函数检测数据中的更改

时间:2010-06-23 15:15:52

标签: mysql hash md5 sha1

我需要为表中的某些数据生成单个哈希

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 具有触发器支持

6 个答案:

答案 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实现,我得到以下散列速度:

  • MD5:411 MB / s
  • SHA-1:336 MB / s
  • SHA-256:145 MB / s
  • SHA-512:185 MB / s

仅使用单核。我的硬盘最高可达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 是最大值,您可以使用不同的值!

相关问题