12

我正在寻找创建一些数据对象的 32 位散列。由于我不想编写自己的散列函数并且 md5 可用,我目前的方法是使用 md5 散列的前 32 位(即前 8 个十六进制数字)。这可以接受吗?

换句话说,md5 散列的前 32 位是否与任何其他子串一样“随机”? 或者有什么理由我更喜欢最后 32 位?或者也许将四个 32 位子字符串异或在一起?

一些先发制人的澄清:

  • 这些哈希不需要是加密安全的。
  • 我不关心 md5 的性能——它的速度足以满足我的需要。
  • 这些散列只需要足够“随机”,以至于很少发生冲突。
  • 在这个系统中,项目的数量不应超过 10,000(实际上它可能不会达到那么高的一半)。所以在最坏的情况下,遇到任何冲突的概率应该是大约 1%(假设找到了一​​个足够“随机”的散列)。
4

3 回答 3

11

对于任何好的散列函数,各个位应该是近似随机的。因此,您应该安全地只使用 MD5 哈希的前 32 位。

或者,您也可以使用计算速度更快的 CRC32(代码大约 20 行)。

于 2009-05-13T21:03:44.840 回答
9

换句话说,md5 散列的前 32 位是否与任何其他子串一样“随机”?

是的。如果答案是否定的,MD5 就不够安全。(当然,它有一些小的加密弱点,但我不知道任何统计弱点)

于 2009-05-13T21:03:43.127 回答
0

这是一个老问题,但它经常出现。答案肯定是否定的,否则 MD5 字符串的长度不需要超过 32 位。

无论如何,一个 MD5 字符串根本不是随机的 - 在相同的输入下它是完全且一致的可重现的(这几乎是反随机的 ;-))。

它对于您的目的是否足够独特取决于您的目的。

于 2011-04-14T19:02:20.657 回答