首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >哈希-冲突:多哈希的机会增长

哈希-冲突:多哈希的机会增长
EN

Stack Overflow用户
提问于 2017-10-11 09:19:16
回答 1查看 643关注 0票数 1

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

意思是,hash(hash(object))的碰撞几率比hash(object)的高吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-11 09:23:04

取决于你到底是什么意思。

如果哈希由于重散列而发生变化,则是的,如果没有,则不会。

如果对象没有更改,并且您重新散列它,它将保持相同的哈希。因此,例如,字符串teststringteststring哈希将始终是D67C5CBF5B01C9F91932E3B8DEF5E5F8

但是,如果对象发生了更改,并因此而重新散列,您将得到一个新的哈希。

现在,如果您重新散列一个已更改的对象,则可能会有更高的碰撞机会。

例如,您有一个非常简单的对象,它只包含一个整数值,还有一个非常简单的散列算法,它只接受这个值并对其执行modulo 20。对于本例来说,这是一种故意错误的散列算法。

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

如果您现在重新哈希,您再次有机会发生1/20碰撞,或者19/20机会不发生冲突。

因此,在n重哈希之后不发生碰撞的机会是(19/20)^(n+1)。因此,在第一次重哈希之后(因此,您有了原始值,并在其更改后重新哈希其中一个值),您就有了一个不发生冲突的90.25%机会。在第二次重哈希之后,您将陷入没有任何冲突的85.76%机会。在100次重哈希之后,您将只剩下一个0.59%的机会,即不会发生碰撞。

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

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

  • 哈希算法为您提供了有限数量的桶(=不同的可能散列)
  • 您可以使用无穷多个不同的值来填充散列算法。
  • 每个值都需要映射到一个桶。
  • 如果有无限多的值映射到有限数量的桶中,那么在某个时候就会发生冲突。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46684443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档