我在Amazon S3上有一个图像库.对于每个图像,我md5我的服务器上的源URL加上一个时间戳来获取唯一的文件名.由于S3不能有子目录,我需要将所有这些图像存储在一个平面文件夹中.
我是否需要担心产生的MD5哈希值中的冲突?
额外奖励:在我开始看到MD5产生的哈希值发生冲突之前,我可以拥有多少个文件?
只有两个哈希意外碰撞的可能性是1/2 128 ,其中 1 340分之十亿分之282十亿分之366千分之一920 octillion 938 septillion 463 sextillion 463 quintillion 374 quadrillion 607万亿431亿768百万211千456.
但是如果保留所有哈希值,那么由于生日悖论,概率会略高一些.要有任何哈希与任何其他哈希冲突的几率为50%,您需要2 64个哈希值.这意味着平均而言,要获得冲突,您需要在100年内每秒哈希60 亿个文件.
S3可以有子目录.只需在密钥名称中加上"/",即可访问这些文件,就好像它们位于不同的目录中一样.我使用它来根据用户在S3中的用户ID将用户文件存储在不同的文件夹中.
例如:"mybucket/users/1234/somefile.jpg".它与文件系统中的目录不完全相同,但S3 API具有一些功能,可以使它几乎完全相同.我可以要求它列出所有以"users/1234 /"开头的文件,它会显示该"目录"中的所有文件.
等等,是吗:
md5(filename) + timestamp
要么:
md5(filename + timestamp)
如果是前者,那么你大部分都是通往GUID的,我不会担心它.如果是后者,那么请参阅Karg的帖子,了解你最终会如何碰撞.
碰撞的粗略经验法则是值范围的平方根.您的MD5 sig大概是128位长,因此您可能会看到超过2 ^ 64个图像的碰撞.
虽然随机MD5冲突极为罕见,但如果您的用户可以提供文件(将逐字存储),那么他们可以设计冲突.也就是说,他们可以故意创建两个具有相同MD5sum但数据不同的文件.确保您的应用程序能够以合理的方式处理这种情况,或者使用像SHA-256这样的更强大的哈希.
尽管由于冲突而引起了人们对MD5的广泛关注,但随机数据之间的无意识冲突却极为罕见。另一方面,如果您要在文件名上进行哈希处理,则该数据不是随机数据,我希望很快会发生冲突。