【发布时间】: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