哈希碰撞:随着多次散列而增长的机会

时间:2017-10-11 09:19:16

标签: hash hash-collision

当您多次对对象进行哈希处理时,哈希冲突的可能性是否会增加?

意思是hash(hash(object))的碰撞碰撞的可能性高于hash(object)

1 个答案:

答案 0 :(得分:2)

取决于你究竟是什么意思。

如果散列由于重新散列而改变,那么是,如果它没有,那么没有。

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

但是如果对象发生了变化并因此而重新发生,那么你将得到一个新的哈希值。

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

比如说,你有一个非常简单的对象,它只包含一个整数值和一个非常简单的散列算法,它只取这个值并在其上做modulo 20。对于此示例,这是一种故意错误的散列算法。

现在说你有两个包含随机数的对象。这两个值的哈希冲突的可能性是1/20,因为在散列算法中有20个桶。

如果你现在重新开始,你再次有机会1/20碰撞碰撞,或19/20碰撞没有机会。

因此n重新发生后无碰撞的可能性为(19/20)^(n+1)。因此,在第一次重新散列后(因此您拥有原始值并在其更改后重新输出其中一个值),您有90.25%的机会不会发生碰撞。在第二次重复之后,你有85.76%的机会没有任何碰撞。在100次重复之后,你只有0.59%没有碰撞的机会。

这取决于每次重新散列之前值都会更改为新值。

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

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