我正在做一些图像处理代码,我从 URL 下载一些图像(如 BufferedImage)并将其传递给图像处理器。
我想避免将同一图像多次传递给图像处理器(因为图像处理操作的成本很高)。图像的 URL 端点(如果它们是相同的图像)可能会有所不同,因此我可以通过 URL 来防止这种情况。所以我打算做一个校验和或散列来确定代码是否再次遇到相同的图像。
对于 md5,我尝试了 Fast MD5 ,它为图像(一些样本)生成了一个 20K+ 字符长度的十六进制校验和值。显然,当涉及到数据库存储时,存储这个 20K+ 字符散列将是一个问题。因此我尝试了 CRC32(来自 java.util.zip.CRC32)。而且它确实生成了比散列小得多的长度校验和。
我知道校验和和散列用于不同的目的。出于上述目的,我可以只使用 CRC32 吗?它会解决目的还是我必须尝试比这两个更多的东西?
谢谢, 阿比
最佳答案
CRC 和 MD5 之间的区别在于,篡改文件以匹配“目标”MD5 比篡改文件以匹配“目标”校验和更难。由于这对您的程序来说似乎不是问题,因此您使用哪种方法应该无关紧要。也许 MD5 可能会占用更多 CPU,但我不知道这种不同是否重要。
主要问题应该是摘要的字节数。
如果您正在执行整数校验和,则意味着对于 2K 大小的文件,您将 2^2048 种组合拟合到 2^32 种组合中 --> 对于每个 CRC 值,您将有 2^64 种可能匹配它的文件。如果您有 128 位 MD5,那么您有 2^16 次可能的冲突。
您计算的代码越大,碰撞的可能性就越小(假定计算的代码分布均匀),因此比较越安全。
无论如何,为了尽量减少可能的错误,我认为第一个分类应该使用文件大小...首先比较文件大小,如果它们匹配,然后比较校验和/哈希。
关于java - 检查两个图像文件是否相同..校验和或哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6382116/