图像哈希指纹冲突(dHash)

Image hash fingerprint collision (dHash)

我在一组非常大的图像中使用 dHash (http://www.hackerfactor.com/blog/index.php?url=archives/529-Kind-of-Like-That.html)。 默认调整大小为 8 像素:

def dhash(image, hash_size=8):
    """
    Difference Hash computation.
    following http://www.hackerfactor.com/blog/index.php?/archives/529-Kind-of-Like-That.html
    @image must be a PIL instance.
    """
    image = image.convert("L").resize((hash_size + 1, hash_size), Image.ANTIALIAS)
    pixels = numpy.array(image.getdata(), dtype=numpy.float).reshape((hash_size + 1, hash_size))
    # compute differences
    diff = pixels[1:, :] > pixels[:-1, :]
    return ImageHash(diff)

如果我们应用这个算法做大量的图像,我不会因为短哈希指纹而发生冲突吗?

什么是最好的hash_size? hash_size不是越大越准确吗?是 8 是因为某些特定原因吗?

您可以通过计算 Y 值与 X 值之间的差异来创建辅助 DHash:

pixels[1:, :] > pixels[:-1, :]

使用两个 DHashes 可以减少冲突的可能性(但不能消除冲突)。

如果您想更进一步,您甚至可以将 PHash(更准确但算法更慢)添加到组合中。在这种情况下,如果您有任何碰撞,则创建两个图像的 PHash 以比较它们。

最后但并非最不重要的一点是,您可以使用大于 8x9 的图像计算哈希值。这将减少误报,但也会增加忽略图像的机会。

最近看了几百万dhashes的统计。分布非常接近均匀,i。 e.至少我的数据集没有任何规律,比如图像的上半部分更亮等等

这意味着冲突的概率接近于每个位独立的二项式情况。 IIRC 正确,8x8 像素意味着您保存的哈希是 64 位。有 264 = 1.8 x 1019 种可能的哈希值,数量很多。生日悖论再次将我们击倒平方根,所以你会期待看到你与你的第 40 亿张图像的第一次碰撞。