散列碰撞:机会随着多重散列而增加

Hash-collision: Chance growing with multiple hashing

多次散列对象时,散列冲突的可能性会增加吗?

意思是,hash(hash(object)) 发生碰撞的几率是否高于 hash(object)

取决于你的意思。

如果哈希因重新哈希而改变,那么是,如果没有,则没有。

如果对象没有改变并且你重新散列它,它将保持相同的散列。因此,例如,字符串 teststring 的 md5 哈希将始终为 D67C5CBF5B01C9F91932E3B8DEF5E5F8.

但是如果对象改变了并且你因此重新散列,你将得到一个新的散列。

现在,如果您重新散列已更改的对象,则发生冲突的可能性会更高。

举例来说,你有一个非常简单的对象,只包含一个整数值和一个非常简单的散列算法,它只接受这个值并对其执行 modulo 20。仅针对此示例,这是一种故意糟糕的哈希算法。

现在假设您有两个包含随机数的对象。这两个值发生哈希冲突的几率是 1/20,因为您在哈希算法中有 20 个桶。

如果你现在重新哈希,你再次有机会 1/20 发生碰撞,或者 19/20 没有碰撞的机会。

因此 n 重新哈希后没有碰撞的机会是 (19/20)^(n+1)。所以在第一次重新散列之后(这样你就有了你的原始值并在其中一个值改变后重新散列一次)你有 90.25% 没有碰撞的机会。第二次重新哈希后,您没有任何碰撞的可能性降低到 85.76%。在 100 次重新哈希后,您只有 0.59% 没有碰撞的机会。

这完全取决于每次重新哈希之前值更改为新值。

证明这一点的另一种方法是:

  • 哈希算法为您提供有限数量的桶(=不同的可能哈希值)
  • 您可以为您的哈希算法提供无限量的不同值
  • 每个值都需要映射到一个桶
  • 如果将无限数量的值映射到有限数量的存储桶,则有时会发生冲突。