【问题标题】:Can I use part of MD5 hash for data identification?我可以使用 MD5 哈希的一部分进行数据识别吗?
【发布时间】:2011-02-16 07:59:07
【问题描述】:

我对@9​​87654321@ 使用 MD5 哈希。这里没有攻击者,所以我不在乎 MD5 是否已被破坏并且可以故意产生冲突。

我的问题是我需要提供日志记录,以便更容易诊断不同的问题。如果我将每个哈希记录为一个太长、不方便且看起来很难看的十六进制字符串,那么我想缩短哈希字符串。

现在我知道只取 GUID is a very bad idea 的一小部分 - GUID 被设计为唯一的,但其中一部分不是。

对于 MD5 是否也是如此 - 我可以说 MD5 的前 4 个字节,并假设由于与原始哈希相比字节数减少,我只会获得更高的冲突概率吗?

【问题讨论】:

  • 我想知道获取前 4 个字节是否比使用 md5 哈希的 CRC32 更好。
  • 是的,因为MD5的前32位应该是完全随机分布的,所以不能改进分布。
  • @Nick D:是的,因为我已经有了那个 MD5 并且它正在控制我的程序流程,而 CRC32 将与它完全无关。
  • sharptooth:我的意思是统计上更好。安德烈亚斯是对的。 CRC32 毫无意义,因为 MD5 旨在在整个 2^128 位范围内具有良好的随机分布。

标签: language-agnostic md5 hash


【解决方案1】:

简短的回答是肯定的,您可以使用前 4 个字节作为 id。不过要小心生日悖论:

http://en.wikipedia.org/wiki/Birthday_paradox

添加更多文件时,发生冲突的风险会迅速增加。 50.000 大约有 25% 的机会发生 id 冲突。

编辑:好的,只需阅读指向您其他问题的链接,对于 100.000 个文件,冲突的可能性大约为 70%。

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      另一种缩短散列的方法是将其转换为比 HEX 更高效的形式,例如 Base64 或其变体。

      即使您决定使用 4 个字符,使用 4 个 base64 字符也会比十六进制提供更多的位。

      【讨论】:

      • 仅当您将十六进制转换为 0-F 形式时。您仍然可以获取原始字节值并使用它。在那种情况下,这将比 base-64 更多位
      猜你喜欢
      • 1970-01-01
      • 2011-02-11
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 2017-05-15
      • 2013-12-13
      • 2011-08-27
      相关资源
      最近更新 更多