Math md5对短字符串(有限数量的字符串)是否有唯一性保证?

Math md5对短字符串(有限数量的字符串)是否有唯一性保证?,math,encryption,hash,computer-science,uniqueidentifier,Math,Encryption,Hash,Computer Science,Uniqueidentifier,所以我知道有证据证明MD5不能保证唯一性,因为宇宙中的字符串比MD5散列字符串多,但是对于有限数量的字符串,有什么相反的证据吗 基本上,如果我有最大长度为X的字符串,是否有一个X保证MD5是唯一的?如果是,那么X是什么?如果X有多个值,那么X的最大值是多少? 或者对于任何其他散列算法,SHA-1等是否有这样的X?您的问题的答案是肯定的。对于任何散列函数,都有一个最大长度X,您将为其返回唯一字符串。但是,找到X可能非常困难。其想法是运行此程序: X= 0; For i = 0 onward

所以我知道有证据证明MD5不能保证唯一性,因为宇宙中的字符串比MD5散列字符串多,但是对于有限数量的字符串,有什么相反的证据吗

基本上,如果我有最大长度为X的字符串,是否有一个X保证MD5是唯一的?如果是,那么X是什么?如果X有多个值,那么X的最大值是多少?


或者对于任何其他散列算法,SHA-1等是否有这样的X?

您的问题的答案是肯定的。对于任何散列函数,都有一个最大长度X,您将为其返回唯一字符串。但是,找到X可能非常困难。其想法是运行此程序:

X= 0;
For i = 0 onward
   For all strings of length i
      Compute the hash code of that string.
      If a collision is found, return X.
   X = i
其思想是列出越来越长的字符串,直到发现哈希冲突。最终您将不得不这样做,因为最终您将生成比可能的哈希输出更多的字符串

根据预期,假设散列函数实际上是非常随机的,则需要生成O(√U) 在找到冲突之前使用不同的字符串,其中U是哈希函数映射到的空间的大小。对于256位哈希,这是2256。这意味着在实践中,除非散列函数被完全破坏,否则上述程序永远不会真正终止,但在理论上,这意味着数字X存在


希望这有帮助

在这里总结优秀答案:

MD5上已知的最短攻击需要2个输入块,即128字节或1024位


对于任何输出N位的散列算法,假设它近似随机地分配输入,您可以假设在大约
sqrt(2^N)
输入中发生冲突的可能性超过50%。例如,MD5哈希为128位,因此您可以预期所有64位输入之间会发生冲突。这假定为一致随机散列。任何弱点都会在冲突发生之前减少输入的数量。

是的,那么有人发现X了吗?@templatetypedef该断言实际上并不成立——有很多已知的冲突,因此,在哈希算法上使用它们的攻击被认为很强。@CharlesDuffy-是的,你说得对(很抱歉!)。我的意思是,找到X的这个值可能意味着有人找到了最短的散列冲突,我的理解是,对于大多数散列函数来说,这还没有完成(我们只知道短散列冲突,而不是最短的).x=1024位,根据以下答案@Oli-该答案表示已知的最短哈希冲突需要1024位。由于MD5输出128位的值,因此保证最短哈希冲突必须比1024位短得多。因此,证明它对于1024位不是唯一的,但对于小于1024位,它是否被证明是唯一的?@xtrahelp.com-对于128位的字符串,必须有冲突,因为有太多的字符串,所以不会发生冲突。1024位远大于所需,但这(显然)是我们实际做的最好的。虽然这是一个提出得很好的问题,但事实上,你问的是哈希的唯一性,这一切都敲响了警钟……前面的问题问的是已知最小的哈希冲突。1024位的值远大于哈希函数128位的输出大小,因此在这个问题中答案毫无意义。好吧,你可以期望64位中有一位,但我们只知道如何可靠地以1024位生成它们。我不知道是否有人测试了所有~2^64短输入的冲突。这是一个很大的工作,在一台计算机上工作了很多年,但不是不可能的。@clunless:对于一台8核4 GHz的机器,我可以用11000年的时间,使用每个哈希600个周期(用作600个周期的参考)。是的,计算2^64 MD5现在是可行的。但我认为2^64输出的存储要昂贵得多(写入存储可能会使您受到IO限制?)有很多方法可以交易更少的存储->更多的时间,但时间会变得昂贵。。。无论如何,是的,它只是一个问题,几年后,直到它的合理便宜。。。