168

我在 Amazon S3 上有一个图像库。对于每张图片,我会 md5 我服务器上的源 URL 加上时间戳以获得唯一的文件名。由于 S3 不能有子目录,我需要将所有这些图像存储在一个平面文件夹中。

我需要担心产生的 MD5 哈希值的冲突吗?

奖励:在我开始看到 MD5 产生的哈希值冲突之前,我可以拥有多少个文件?

4

8 回答 8

317

仅两个哈希意外碰撞的概率为1/2 128 ,即340 十亿分之一 282 十亿分之 366 十亿分之 920 十亿分之一 938 十亿分之一 463 六分之一 463 十亿分之一 374 万亿分之一 607 万亿 4310 亿 7.68 亿 21.1 万 456。

但是,如果您保留所有哈希值,那么由于生日悖论,概率会更高一些。要使任何散列与任何其他散列冲突的概率为 50%,您需要2 64 个散列。这意味着要发生冲突,平均而言,您需要在100 年内每秒散列60亿个文件

于 2008-11-13T22:06:41.253 回答
28

S3 可以有子目录。只需在键名中添加一个“/”,您就可以访问这些文件,就好像它们位于不同的目录中一样。我使用它根据 S3 中的用户 ID 将用户文件存储在单独的文件夹中。

例如:“mybucket/users/1234/somefile.jpg”。它与文件系统中的目录并不完全相同,但 S3 API 具有一些使其工作方式几乎相同的特性。我可以要求它列出所有以“users/1234/”开头的文件,它会显示该“目录”中的所有文件。

于 2008-10-14T15:46:53.233 回答
19

等等,是不是:

md5(filename) + timestamp

或者:

md5(filename + timestamp)

如果是前者,那么您最容易获得 GUID,我不会担心。如果是后者,请参阅 Karg 的帖子,了解您最终将如何遇到碰撞。

于 2008-10-14T15:47:34.467 回答
10

碰撞的粗略经验法则是值范围的平方根。您的 MD5 信号大概是 128 位长,因此您可能会看到超过 2^64 图像的冲突。

于 2008-10-14T15:45:59.383 回答
7

尽管随机 MD5 冲突极为罕见,但如果您的用户可以提供文件(将逐字存储),那么他们可以设计发生冲突。也就是说,他们可以故意创建两个 MD5sum 相同但数据不同的文件。确保您的应用程序能够以合理的方式处理这种情况,或者可能使用更强的哈希值,如 SHA-256。

于 2009-05-05T00:45:12.670 回答
5

尽管 MD5 因碰撞而引起的问题已广为人知,但随机数据之间的意外碰撞极为罕见。另一方面,如果您对文件名进行哈希处理,那不是随机数据,我希望很快就会发生冲突。

于 2008-10-14T15:48:28.270 回答
2

可能性有多大并不重要;有可能的。它可能发生在您散列的前两件事上(非常不可能,但可能),因此您需要从一开始就支持冲突。

于 2008-10-14T15:45:00.117 回答
1

MD5 碰撞是极不可能的。如果你有9 万亿个MD5,那么9 万亿中只有一次发生碰撞的机会。

于 2016-07-12T00:12:44.953 回答