Image 通过在图像内容上运行MD5为随机图像生成唯一文件名有何注意事项?

Image 通过在图像内容上运行MD5为随机图像生成唯一文件名有何注意事项?,image,hash,md5,filenames,random,Image,Hash,Md5,Filenames,Random,我想为每个图像生成唯一的文件名,所以我使用MD5生成文件名。由于同一图像中的两个可能来自不同的位置,因此我希望实际根据图像内容生成哈希。这说明了什么 (在PHP5上这样做是值得的)如果您对32个字符的文件名没有问题,我觉得这很好 编辑:我不会将此作为(比如)FBI恐怖分子面部照片中央数据库的基础,因为一个动机充分的攻击者可能会得到一张与现有图像具有相同MD5的图像。如果是这样的话,那么您可以使用SHA1,这会更安全。这是一个很好的方法。两个不同的图像散列为相同值的可能性极小,但实际上,数据中心遭

我想为每个图像生成唯一的文件名,所以我使用MD5生成文件名。由于同一图像中的两个可能来自不同的位置,因此我希望实际根据图像内容生成哈希。这说明了什么


(在PHP5上这样做是值得的)

如果您对32个字符的文件名没有问题,我觉得这很好


编辑:我不会将此作为(比如)FBI恐怖分子面部照片中央数据库的基础,因为一个动机充分的攻击者可能会得到一张与现有图像具有相同MD5的图像。如果是这样的话,那么您可以使用SHA1,这会更安全。

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


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

如果您从不同位置加载了两个相同的图像,例如一张库存照片,然后你可能会写得太多了。但是,这意味着您只存储一个副本,而不是两个


话虽如此,我看不出用你描述的方式做这件事有什么大问题。

这会很费时。为什么不给它们分配顺序ID呢?

您可以使用UUID来代替?

您可能需要研究P2P网络用于识别重复文件的技术。一个涉及MD5、SHA-1和文件长度的解决方案是非常可靠的(而且可能是多余的)。

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

您的文件内容显然不是随机的,但我不知道这对碰撞概率的影响有多大。这就是所谓的生日攻击,如果你想谷歌更多


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

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

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


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

因为如果两个人上传同一张图像,我不想存储两次。