这个方法比较的是图像的像素值吗?我猜测它不起作用,因为它们的大小不同,但如果它们是相同的,但格式不同呢?例如,我截了两张屏幕截图,一张保存为.jpg
,另一张保存为.gif
。
MD5哈希值是基于二进制数据计算的,因此不同格式的文件将具有完全不同的二进制数据。
所以,要使MD5哈希值匹配,它们必须是相同的文件。 (在一些边缘情况下可能会有例外,详情请参考维基百科)
事实上,这是司法执法机构寻找被视为违禁品的数据(就图像而言)的一种方法。
这是一个MD5校验和——通常在下载文件时会遇到。如果下载的文件的MD5与提供者给出的MD5匹配,则文件传输成功。http://en.wikipedia.org/wiki/Checksum 如果两个文件之间有一位不同,那么生成的哈希值将完全不同。
由于JPG和GIF之间编码的差异,它们的MD5哈希值也不相同。
md5
是一种哈希算法,所以它不会比较图像,而是比较数据。您输入的数据可以是几乎任何东西,例如文件的内容。然后根据这些内容输出一个哈希字符串,这个字符串是文件的原始数据。
因此,在将图像传递到 md5
时,您实际上并不会比较图像,而是比较图像的原始数据。哈希算法只知道这些原始数据,并不了解其他内容,因此同一截图的jpg和gif(或任何其他图像格式)永远不会相同。
即使您比较解码后的图像,它也不会输出相同的哈希值,而会有一些肉眼看不见的小差异(这取决于使用的压缩量)。当比较无损编码图像的已解码数据时,情况可能有所不同,但我在这方面不太清楚。
请参阅维基百科文章以获取有关哈希函数的更详细解释和技术背景。
当你查看原始字节时,.jpg文件以“JFIF”开头,.gif文件以“GIF”开头。换句话说,比较两种不同格式的“相同图像”的磁盘上的字节几乎肯定会产生两个不同的MD5哈希值,因为文件内容不同,即使实际的图像是“相同的图片”。
要进行基于哈希的图像比较,必须使用相同格式比较两个图像。如果将它们转换为(例如).bmp,则非常难以生成相同的图像,其中一个是.jpg,另一个是.gif。它们可能是相同的文件格式,但.gif的内部要求(8位、RLE/LZW无损压缩)与.jpg的内部要求(24位、有损离散余弦变换压缩)意味着从这两个源图像中获得相同的.bmp几乎是不可能的。
如果您正在比较哈希值,则两个图像的每个字节都必须匹配,它们不能使用不同的压缩格式或“看起来相同”。它们必须完全相同。
MD5是一种哈希算法。它是从一堆数据中计算出来的代码 - 任何数据都可以。
MD5肯定不是唯一的,但两个不同图像具有完全相同代码的机会非常小。因此,您可以通过从每个图像计算MD5代码并比较代码来比较图像。
正如其他帖子中所指出的那样,您不能使用MD5摘要进行比较。但是,您可以以不同的方式比较图像,并且它将告诉您它们的相似性,而不管图像类型甚至大小。您可以使用libPuzzle。
http://libpuzzle.pureftpd.org/project/libpuzzle
这是一个非常好用的图像比较库,功能非常强大。
这仍然不会起作用。任何图像都包含头部部分和二进制图像缓冲区。在上述情况下: 1. .jpg和.gif之间的头部将不同,导致不同的md5校验和 2. 由于像.jpg格式使用的图像压缩方式不同,图像缓冲区本身可能也会不同。
md5sum
是一种用于验证文件完整性的工具,因为对文件的任何更改都会导致其 MD5 哈希值发生变化。
最常见的情况是,md5sum
用于验证文件在传输过程中没有发生更改,也没有磁盘错误或非恶意干扰。 md5sum
程序包含在大多数类 Unix 操作系统或兼容层(如 Cygwin)中。
因此它不能用于比较图像。
在图像上运行 md5sum
将基于图像原始数据生成 md5 哈希值
。这些图像的哈希字符串输出将不同,因为图像格式不同,例如 GIF 和 JPEG。
此外,如果您比较这些图像的大小,它们也不会相同。通常情况下,GIF
图像可能比 JPEG
文件更大,这意味着 MD5 哈希值
字符串根本不匹配。