如何通过md5比较图像?

时间:2011-01-31 16:17:05

标签: php image hash compare md5

此方法是否比较图像的像素值?我猜它不会起作用,因为它们彼此的大小不同但是如果它们是相同的,但是以不同的格式呢?例如,我截取屏幕截图并保存为.jpg,另一个保存为.gif

8 个答案:

答案 0 :(得分:13)

MD5哈希是实际的二进制数据,因此不同的格式将具有完全不同的二进制数据。

因此要使MD5哈希匹配,它们必须是相同的文件。 (fringe cases.

中有例外

这实际上是法医执法部门发现其认为违禁品的一种方式。 (参考图像)

答案 1 :(得分:8)

这是一个MD5校验和 - 与下载文件时经常看到的相同,如果下载文件的MD5与提供商提供的MD5相匹配,则文件传输成功。 http://en.wikipedia.org/wiki/Checksum如果两个文件之间甚至有1位差异,则生成的哈希将完全不同。

由于JPG和GIF之间的编码不同,2将不会有相同的MD5哈希值。

答案 2 :(得分:2)

您无法使用MD5总和进行比较,因为所有其他海报都已注明。但是,您可以以不同的方式比较图像,无论图像类型,甚至大小,它都会告诉您它们的相似性。你可以使用libPuzzle

http://libpuzzle.pureftpd.org/project/libpuzzle

这是一个很棒的图像比较库,效果很好。

答案 3 :(得分:2)

.jpg文件以'JFIF'开头,当您查看原始字节时,.gif以'GIF'开头。换句话说,比较两个不同格式的“相同图像”的磁盘上字节几乎可以保证产生两个不同的MD5哈希值,因为文件的内容不同 - 即使实际图像是“相同图像”。

要进行基于散列的图像比较,您必须使用相同的格式比较两个图像。如果将它们转换为(比如说).bmp,那么生成同一图像的.jpg和.gif非常非常难以比较相等。它是相同的文件格式,但是.gif(8bit,RLE / LZW无损压缩)v.s.的内部要求。 .jpg(24位,有损离散余弦变换压缩)的内部要求意味着它几乎不可能从两个源图像中获得相同的.bmp。

答案 4 :(得分:1)

如果您要比较哈希值,那么两个图像的每个字节都必须匹配 - 它们不能使用不同的压缩格式,或“看起来相同”。它们必须完全相同。

答案 5 :(得分:1)

md5是一种哈希算法,因此它不会比较图像,但会比较数据。您输入的数据几乎可以是任何内容,例如文件的内容。然后它根据内容输出一个hashstring,它是文件的原始数据。

因此,在将图像输入md5但图像的原始数据时,基本上不会比较图像。哈希算法对原始数据一无所知,因此相同屏幕截图的 jpg gif (或任何其他图像格式)将永远不会相同

即使您比较解码图像,它也不会输出相同的哈希值,但是人眼无法看到的差异很小(取决于使用的压缩量)。在比较无损编码图像解码数据时,这可能会有所不同,但我不知道。

请查看wikipedia article以获取有关哈希函数的更详细说明和技术背景。

答案 6 :(得分:0)

md5是哈希。这是一个根据一堆数据计算的代码 - 真正的任何数据。

md5肯定不是唯一的,但是两个不同图像具有完全相同代码的可能性非常小。因此,您可以通过计算每个图像的md5代码来比较图像并比较代码。

答案 7 :(得分:0)

它仍然无效。任何图像都包含标题部分和二进制图像缓冲区。在上述场景中 1.标题在.jpg和&之间是不同的。 .gif导致不同的md5总和 2.由于像.jpg格式所使用的图像压缩,图像缓冲区本身可能不同。