为什么两个不同对象上的散列函数返回相同的值?

时间:2016-07-14 00:15:11

标签: python hash

我使用Spyder,运行Python 2.7。

刚发现有趣的事情:

  1. hash(-1)和hash(-2)都返回-2,有问题吗?我虽然不同对象上的哈希函数应该返回不同的值。我读过以前的帖子,-1在Python中被保留为错误。
  2. hash(' s')返回1835142386,然后hash(1835142386)返回相同的值。这是另一个问题吗?
  3. 感谢。

1 个答案:

答案 0 :(得分:1)

-1不是"保留为错误"在Python中。不确定那甚至意味着什么。如果您不允许使用-1,那么您可以简单而清晰地编写大量的程序。

"有问题吗?"不需要。散列函数不需要为每个对象返回不同的散列。事实上,这是不可能的,因为有更多可能的对象而不是哈希。 CPython的hash()具有很好的属性,可以将非负数的参数返回到sys.maxint,这就是为什么在你的第二个问题hash(hash('s')) == hash('s')中,但这是一个实现细节

-1和-2具有相同的哈希的事实仅仅意味着使用这些值作为例如字典键将导致哈希冲突。散列冲突是预期情况并且由Python自动解决,添加的第二个密钥将简单地进入字典中的下一个可用插槽。访问第二个插入的密钥会比访问另一个密钥慢一些,但在大多数情况下, 的速度要慢一些,你注意不到。

可以构造大量具有相同散列值的不等对象,当存储在字典或集合中时,会导致容器的性能显着恶化,因为添加的每个对象都会导致散列碰撞,但除非你去寻找它,否则它不会遇到什么。

相关问题