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

Cha*_*iga 9 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)
);
Run Code Online (Sandbox Code Playgroud)

即F1,F3,FN,其中F2 = 10

SELECT md5(CONCAT_WS('#',F1,F3,FN)) FROM Tabe1 WHERE F2=10
Run Code Online (Sandbox Code Playgroud)

为表中的每一行提供一个哈希值.

质询

1)如何在整个表上获得单个哈希?

2)使用MD5,SHA1,SHA或其他任何方法的fasts哈希算法是什么?

编辑:

MySQL 4.1中被使用了-它确实具备触发支持

Nak*_*lda 10

1)

SELECT MD5( GROUP_CONCAT( CONCAT_WS('#',F1,F3,FN) SEPARATOR '##' ) ) FROM Table1
Run Code Online (Sandbox Code Playgroud)

2)速度并不重要,因为函数必须只运行一次,所有哈希函数都足够快

  • 是否可以选择所有列而不是列出每一列? (2认同)

Tho*_*nin 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在非安全情况下仍然可以正常使用.