Language agnostic md5散列的前32位是否与;“随机”;和其他子串一样?

Language agnostic md5散列的前32位是否与;“随机”;和其他子串一样?,language-agnostic,md5,hash,Language Agnostic,Md5,Hash,我想创建一些数据对象的32位散列。由于我不想编写自己的散列函数,而且md5是可用的,所以我当前的方法是使用md5散列中的前32位(即前8个十六进制数字)。这可以接受吗 换句话说,md5散列的前32位是否与任何其他子字符串一样“随机”?或者我为什么更喜欢最后32位?或者可能将四个32位子字符串异或在一起 一些先发制人的澄清: 这些散列不需要加密安全 我不关心md5的性能——它的速度足以满足我的需要 这些散列只需要足够“随机”,以避免碰撞 在这个系统中,项目的数量不应该超过10000个(实际上可能

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

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

一些先发制人的澄清:

  • 这些散列不需要加密安全

  • 我不关心md5的性能——它的速度足以满足我的需要
  • 这些散列只需要足够“随机”,以避免碰撞
  • 在这个系统中,项目的数量不应该超过10000个(实际上可能不会达到一半)。因此,在最坏的情况下,遇到任何冲突的概率应该是1%(假设找到了一个足够“随机”的散列)
换句话说,是前32位 md5散列的“随机性”与任何 其他子串


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

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


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

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

不管怎么说,MD5字符串根本不是随机的——给定相同的输入(这几乎是反随机的;-),它是完全且一致的可复制的


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

MD5没有足够的安全性,正如许多攻击所表明的那样:)只有在添加了限定条件后,该语句才是正确的。它的安全性不足以使所有碰撞攻击都不可行。它(到目前为止)足够安全,使预映像攻击不可行。另请参阅不要吹毛求疵,但我的帖子没有说MD5足够安全。:-)“我不关心md5的性能——它的速度足以满足我的需要。”Kip:性能与否,CRC32会给你一个32位的哈希值,这正是你想要的。你已经计算了md5哈希值了吗?(例如,作为Subversion签入元数据的一部分)或者您必须自己计算MD5哈希吗?如果是后者,我同意w/@Johannes的评论,CRC32会简单得多。显然,没有办法抢先解决“你的问题是无效的,因为你应该这样做”的评论…对不起,我不是说不要使用MD5哈希,我只是说CRC32更简单。您或您的客户是唯一能够判断哪些算法符合您的要求的人。我不知道您是否已经知道这一点,但10000个条目发生冲突的1%几率实际上与您使用32位散列所期望的几乎完全相同——请看@mjs:是的,我知道,这就是我从中获得该数字的原因。:)