【发布时间】:2011-09-16 22:46:39
【问题描述】:
我正在做一些图像处理代码,其中我从 URL 下载一些图像(作为 BufferedImage)并将其传递给图像处理器。
我想避免将同一图像多次传递给图像处理器(因为图像处理操作成本很高)。图像的 URL 端点(如果它们是相同的图像)可能会有所不同,因此我可以通过 URL 来防止这种情况。所以我打算做一个校验和或哈希来识别代码是否再次遇到相同的图像。
对于 md5,我尝试了Fast MD5,它为图像生成了一个 20K+ 字符长度的十六进制校验和值(一些示例)。显然,当涉及到数据库存储时,存储这个 20K+ 字符散列将是一个问题。因此我尝试了 CRC32(来自 java.util.zip.CRC32)。而且它确实生成了比散列更小的长度校验和。
我确实了解校验和和哈希用于不同的目的。出于上述目的,我可以只使用 CRC32 吗?它会解决目的还是我必须尝试比这两个更多的东西?
谢谢, 阿比
【问题讨论】:
-
Checksum and hash sum are the same。实际上你只是看看不同的算法。
-
128 位 MD5 哈希值应该足以满足您的目的。
-
BTW - MD5 应该创建一个 128 位哈希值,而 crc32 有 32 位...你做了什么来生成 20k+ 长度的十六进制校验和?
-
我相信这将取决于要处理的图像数量。碰撞概率会随着图像数量的增加而增加。毕竟 32 位 (CRC32) 或 128 位 (MD5) 只能做这么多。
-
也许分阶段比较;首先,检查尺寸和文件大小。如果没有匹配,则将其传递给处理器。其次,对第一行或两行像素或前 1K 等(将存储在数据库中;小得多,因为它只是图像的一个子集)进行哈希处理。如果这两个测试相等,那么并且仅在那时,对原始文件和新文件进行哈希处理。这应该在实际散列整个图像之前消除大部分集合。
标签: java image-processing hash checksum integrity