python – 为什么两个不同对象的哈希函数返回相同的值?

我使用Spyder,运行
Python 2.7.

刚发现有趣的东西:

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

谢谢.

最佳答案 -1在Python中不是“保留为错误”.不确定那甚至意味着什么.如果你不被允许使用-1,那么有很多程序你不能简单而清楚地写出来.

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

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

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

点赞