当您多次对对象进行哈希处理时,哈希冲突的可能性是否会增加?
意思是hash(hash(object))
的碰撞碰撞的可能性高于hash(object)
?
答案 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%
没有碰撞的机会。
这取决于每次重新散列之前值都会更改为新值。
证明这一点的另一种方法是: