我在 Amazon S3 上有一个图像库。对于每张图片,我会 md5 我服务器上的源 URL 加上时间戳以获得唯一的文件名。由于 S3 不能有子目录,我需要将所有这些图像存储在一个平面文件夹中。
我需要担心产生的 MD5 哈希值的冲突吗?
奖励:在我开始看到 MD5 产生的哈希值冲突之前,我可以拥有多少个文件?
仅两个哈希意外碰撞的概率为1/2 128 ,即340 十亿分之一 282 十亿分之 366 十亿分之 920 十亿分之一 938 十亿分之一 463 六分之一 463 十亿分之一 374 万亿分之一 607 万亿 4310 亿 7.68 亿 21.1 万 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 信号大概是 128 位长,因此您可能会看到超过 2^64 图像的冲突。
尽管随机 MD5 冲突极为罕见,但如果您的用户可以提供文件(将逐字存储),那么他们可以设计发生冲突。也就是说,他们可以故意创建两个 MD5sum 相同但数据不同的文件。确保您的应用程序能够以合理的方式处理这种情况,或者可能使用更强的哈希值,如 SHA-256。
尽管 MD5 因碰撞而引起的问题已广为人知,但随机数据之间的意外碰撞极为罕见。另一方面,如果您对文件名进行哈希处理,那不是随机数据,我希望很快就会发生冲突。
可能性有多大并不重要;有可能的。它可能发生在您散列的前两件事上(非常不可能,但可能),因此您需要从一开始就支持冲突。
MD5 碰撞是极不可能的。如果你有9 万亿个MD5,那么9 万亿中只有一次发生碰撞的机会。