6

我想为每个图像生成唯一的文件名,所以我使用 MD5 来制作文件名。由于两个相同的图像可能来自不同的位置,我想实际上基于图像内容的哈希。这有什么注意事项?

(用 PHP5 这样做是值得的)

4

9 回答 9

5

这是一个很好的方法。两个不同的图像哈希到相同值的可能性极小,但实际上您的数据中心遭受小行星直接撞击的可能性更大。

一个警告是删除图像时应该小心。如果您删除了指向某个文件的图像记录并且您也删除了该文件,那么您可能正在删除具有指向同一图像的不同记录的文件(例如,属于不同的用户)。

于 2008-10-15T19:11:47.393 回答
3

给定完全随机的文件内容和良好的加密散列,当文件数量大约为 2 到(散列函数中的位数 / 2)时,会有两个具有相同散列值的文件的概率达到 50%。也就是说,对于 128 位哈希,当文件数达到 2^64 时,至少有 50% 的机会发生冲突。

您的文件内容绝对不是随机的,但我不知道这对碰撞概率的影响有多大。这被称为生日攻击,如果你想用谷歌搜索更多信息。

这是一个概率游戏。如果图像的数量将大大少于 2^64,那么您可能没问题。如果您仍然担心,使用 SHA-1 和 MD5 的组合(正如另一个答案所建议的那样)可以获得总共 288 个高质量哈希位,这意味着您将有 50% 的机会在那里发生冲突是 2^144 个文件。2^144 是一个非常大的数字。厉害大。甚至可以说是巨大的。

于 2008-10-15T19:54:30.083 回答
3

您应该使用 SHA-1 而不是 MD5,因为 MD5 已损坏。有成对的不同文件具有相同的 MD5 哈希(不是理论上的;这些实际上是已知的,并且有生成更多对的算法)。对于您的应用程序,这意味着有人可以上传两个具有相同 MD5 哈希的不同图像(或者有人可以生成这样一对图像并将它们发布到 Internet 的某个位置,以便您的两个用户稍后会尝试上传它们,使用结果令人困惑)。

于 2008-10-15T20:23:00.760 回答
2

如果您对 32 个字符的文件名没问题,对我来说似乎很好。

编辑:我不会将其用作(例如)FBI 的恐怖分子照片中央数据库的基础,因为有足够动机的攻击者可能会想出与现有图像具有相同 MD5 的图像。如果这种情况,那么您可以改用 SHA1,这会更安全一些。

于 2008-10-15T19:11:27.597 回答
1

您可以改用 UUID 吗?

于 2008-10-15T19:13:50.803 回答
0

如果您从不同的地方加载了两张相同的图像,比如一张库存照片,那么您最终可能会覆盖“原始”。但是,这意味着您只存储一个副本,而不是两个。

话虽如此,我认为按照您描述的方式进行操作没有任何大问题。

于 2008-10-15T19:11:51.837 回答
0

这将是耗时的。为什么不给它们分配顺序 ID?

于 2008-10-15T19:11:52.633 回答
0

您可能想研究 P2P 网络用于识别重复文件的技术。涉及 MD5、SHA-1 和文件长度的解决方案将非常可靠(并且可能是矫枉过正)。

于 2008-10-15T19:33:08.067 回答
0

ImageMagick 和 PHP 类 imagick,访问它能够比散列函数更主观地解释图像,而不是像颜色这样的因素。有无数的方法和用户偏好需要考虑,所以这里有一些资源,涵盖了一些方法,看看哪些方法可能适合您的预期应用程序:

任何像 MD5 这样的散列函数只会尝试确定文件是否相同 -按位,而不是检查视觉相似性(有损压缩或轻微裁剪的误差范围)。

于 2013-08-03T16:56:45.693 回答