散列碰撞:机会随着多重散列而增加
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%
没有碰撞的机会。
这完全取决于每次重新哈希之前值更改为新值。
证明这一点的另一种方法是:
- 哈希算法为您提供有限数量的桶(=不同的可能哈希值)
- 您可以为您的哈希算法提供无限量的不同值
- 每个值都需要映射到一个桶
- 如果将无限数量的值映射到有限数量的存储桶,则有时会发生冲突。
多次散列对象时,散列冲突的可能性会增加吗?
意思是,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%
没有碰撞的机会。
这完全取决于每次重新哈希之前值更改为新值。
证明这一点的另一种方法是:
- 哈希算法为您提供有限数量的桶(=不同的可能哈希值)
- 您可以为您的哈希算法提供无限量的不同值
- 每个值都需要映射到一个桶
- 如果将无限数量的值映射到有限数量的存储桶,则有时会发生冲突。