我需要一个(最好是简单快速的)图像散列算法。哈希值用于查找表,而不是用于密码学。
一些图像是“计算机图形”——即纯色填充的矩形、光栅化文本等,而也有“摄影”图像——包含丰富的色谱,大部分是平滑的,具有合理的噪声幅度。
我还希望散列算法能够应用于特定的图像部分。我的意思是,图像可以划分为一个网格单元格,每个单元格的哈希函数应该只取决于这个单元格的内容。因此,如果两个图像具有共同区域(以防它们正确对齐),则可以快速发现。
注意:我只需要知道两个图像(或它们的部分)是否相同。也就是说,我不需要匹配相似的图像,不需要特征识别、相关和其他DSP技术。
我想知道首选的哈希算法是什么。
对于“摄影”图像,只需对网格单元内的所有像素进行异或运算或多或少都可以。不同图像的相同哈希值的概率非常低,特别是因为(近乎白)噪声的存在破坏了所有潜在的对称性。加上这种散列函数的频谱看起来不错(任何值都可能具有几乎相同的概率)。
但这种幼稚的算法可能不适用于“人造”图形。相同像素、重复图案、几何偏移不变性对于此类图像非常常见。对于具有偶数个相同像素的任何图像,对所有像素进行异或运算将为 0。
使用像 CRT-32 之类的东西看起来很有希望,但我想更快地找出一些东西。我想到了迭代公式,每个新像素都会改变当前的哈希值,如下所示:
hashValue = (hashValue * /*something*/ | newPixelValue) % /* huge prime */
做模素数可能会产生良好的分散性,所以我倾向于这个选项。但我想知道是否有更好的变体。
提前致谢。