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

Che*_*eng 7 python hash

我使用了 Spyder,运行 Python 2.7。

刚刚发现有趣的事情:

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

谢谢。

kin*_*all 4

-1 在 Python 中不是“保留为错误”。不确定这意味着什么。如果不允许使用 -1,有大量程序将无法简单清晰地编写。

“有问题吗?” 不需要。哈希函数不需要为每个对象返回不同的哈希值。事实上,这是不可能的,因为可能的对象比哈希值要多得多。CPythonhash()有一个很好的属性,可以返回其参数sys.maxint,直到 ,这就是第二个问题的原因hash(hash('s')) == hash('s'),但这是一个实现细节。

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

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