【问题标题】:Are the first 32 bits of an md5 hash just as "random" as any other substring?md5 哈希的前 32 位是否与任何其他子字符串一样“随机”?
【发布时间】:2010-10-26 00:21:13
【问题描述】:

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

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

一些先发制人的澄清:

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

【问题讨论】:

  • 您是否已经计算了 MD5 哈希? (例如,作为 Subversion 签入元数据的一部分)还是您必须自己计算 MD5 哈希?如果是后者,我同意@Johannes 的评论,CRC32 会简单得多。
  • 显然没有办法抢先解决“你的问题是无效的,因为你应该这样做”cmets ...
  • 抱歉,我不是说不要使用 MD5 哈希,我只是说 CRC32 更简单。只有您或您的客户才能判断哪些算法符合您的要求。
  • 我不知道你是否已经知道这一点,但 1% 的机会与 10,000 个条目发生冲突实际上几乎正是你对 32 位哈希的期望——请参阅en.wikipedia.org/wiki/Birthday_problem
  • 您可能会发现this 很有帮助。它凭经验表明 MD5 和 SHA-1 都是“足够随机的”,因此您可以预期,对于 10,000 个具有 32 位哈希部分的条目,实际发生冲突的可能性约为 1-2%。跨度>

标签: language-agnostic md5 hash


【解决方案1】:

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

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

【讨论】:

  • “我不关心 md5 的性能——它的速度足以满足我的需要。”
  • Kip:性能与否,CRC32 为您提供 32 位哈希,这正是您想要的。
【解决方案2】:

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

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

【讨论】:

  • MD5 不够安全正如许多攻击所表明的那样:)
  • 该陈述仅在添加限定条件时才成立。使所有碰撞攻击都不可行是不够安全的。它(到目前为止)足够安全,可以使原像攻击不可行。见vpnc.org/hash.html
  • 也不要吹毛求疵,但我的帖子并没有说 MD5 足够安全。 :-)
【解决方案3】:

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

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

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

【讨论】:

  • 其他答案正确,这个错误。
猜你喜欢
  • 2011-04-18
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 2016-09-16
  • 2011-08-17
  • 2012-10-10
  • 2013-08-13
相关资源
最近更新 更多