我正在做一些图像处理代码,其中我从 URL 下载一些图像(如 BufferedImage)并将其传递到图像处理器。
我想避免将同一图像多次传递给图像处理器(因为图像处理操作的成本很高)。图像的 URL 端点(如果它们是相同的图像)可能会有所不同,因此我可以通过 URL 来防止这种情况。因此,我计划进行校验和或哈希来确定代码是否再次遇到相同的图像。
对于 md5 我尝试过Fast MD5 http://www.twmacinta.com/myjava/fast_md5.php,并且它为图像(一些示例)生成了 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 种冲突。
计算的代码越大,发生冲突的可能性就越小(假定计算的代码分布均匀),因此比较就越安全。
无论如何,为了最大限度地减少可能的错误,我认为第一个分类应该使用文件大小...首先比较文件大小,如果它们匹配,则比较校验和/哈希。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)