Answers:
只有两个散列意外碰撞的概率为1/2 128 ,其是在340 undecillion 282 decillion 366 nonillion 920千的十六次方938 septillion 463 sextillion 463三次方374万亿6070000亿431十亿7.68亿211000 456 1。
但是,如果保留所有哈希值,则由于生日悖论,发生的可能性会更高。要使任何散列与任何其他散列冲突的可能性为50%,您需要2 64个散列。这意味着,要平均产生碰撞,您需要在100年的时间内每秒散列60 亿个文件。
1 - sPn/s^n
,其中s
是搜索空间的大小(2^128
在这种情况下),n
是散列的项目数。您可能会想到的是2^64
,这是您需要对MD5进行哈希处理才能产生50%的碰撞几率的大概数量。
所以,等等:
md5(filename) + timestamp
要么:
md5(filename + timestamp)
如果是前者,那么大多数情况下都是使用GUID的方式,我不会为此担心。如果是后者,则请参阅Karg的帖子,其中介绍了您最终将如何发生碰撞。
md5(filename) + timestamp
大大降低了碰撞风险,因为您需要在完全相同的时间戳上发生md5碰撞,才能整体上发生碰撞。md5(filename + timestamp)
与相同md5(filename)
,假设文件名开头是随机的(因为为随机数添加更多随机性只会更改单个md5结果,并且所有md5哈希值仍然存在生日问题)。
冲突的经验法则是值范围的平方根。您的MD5信号大概为128位长,因此您很可能会看到2 ^ 64张图像之上和之外的碰撞。
尽管随机发生的MD5冲突非常少见,但是如果您的用户可以提供文件(将逐字存储),则他们可以设计发生冲突的过程。也就是说,他们可以故意创建两个具有相同MD5sum但数据不同的文件。确保您的应用程序可以以明智的方式处理这种情况,或者使用更强大的哈希(例如SHA-256)。
尽管由于冲突而引起了人们对MD5的广泛关注,但随机数据之间的无意识冲突却极为罕见。另一方面,如果您要在文件名上进行哈希处理,则该数据不是随机数据,并且我希望很快发生冲突。
可能性有多大都不重要;有可能的。散列的前两件事可能会发生这种情况(极不可能,但有可能),因此您需要从一开始就支持冲突。
MD5碰撞极不可能。如果你有90000个亿 MD5s,存在只有一个机会九万亿会有冲突。