md5哈希的前32位是否与任何其他子串一样“随机”?

时间:2009-05-13 20:59:32

标签: language-agnostic md5 hash

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

换句话说,md5哈希的前32位是否与任何其他子字符串一样“随机”?或者是否有任何理由我更喜欢,比如最后32位?或者可能将四个32位子串一起异或?

一些先发制人的澄清:

  • 这些哈希值不需要加密安全。
  • 我并不关心md5的性能 - 它足以满足我的需求。
  • 这些哈希只需要“随机”足以使碰撞很少见。
  • 在这个系统中,项目数量不应超过10,000(实际上它可能不会达到一半那么高)。因此,在最坏的情况下,遇到任何碰撞的概率应该是大约1%(假设找到了足够的“随机”散列)。

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:9)

  

换句话说,是前32位   一个md5哈希就像任何“随机”一样   其他子串?

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

答案 2 :(得分:1)

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

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

它是否足以满足您的目的取决于您的目的。