Abh*_*hek 8 java hash checksum image-processing integrity
我正在做一些图像处理代码,我从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个可能的冲突.
您计算的代码越大,碰撞可能性越小(假设计算的代码均匀分布),因此比较更安全.
无论如何,为了尽可能减少可能的错误,我认为第一个分类应该使用文件大小...首先比较文件大小,如果它们匹配则比较校验和/散列.
校验和和哈希值基本相同。您应该能够计算任何类型的哈希值。常规 MD5 通常就足够了。如果您愿意,您可以存储大小和 md5 哈希值(我认为是 16 个字节)。
如果两个文件的大小不同,则它们是不同的文件。您甚至不需要计算数据的哈希值。如果您不太可能有许多重复文件,并且文件较大(例如用相机拍摄的 JPG 图片),则此优化可能会节省您很多时间。
如果两个或多个文件具有相同的大小,您可以计算哈希值并比较它们。
如果两个哈希值相同,您可以比较实际数据以查看是否不同。这是非常非常不可能的,但理论上是可能的。哈希值越大(md5 为 16 个字节,而 CR32 只有 4 个字节),两个不同文件具有相同哈希值的可能性就越小。不过,执行这项额外检查只需要 10 分钟的编程时间,所以我想说:安全总比后悔好。:)
为了进一步优化这一点,如果两个文件的大小完全相同,您只需比较它们的数据即可。无论如何,您都需要读取这些文件来计算它们的哈希值,所以如果它们是仅有的两个具有该特定大小的文件,为什么不直接比较它们呢?
归档时间: |
|
查看次数: |
16809 次 |
最近记录: |