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

2024-04-19 11:48:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Spyder,运行Python2.7。在

刚发现有趣的事情:

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

谢谢。在


Tags: 对象函数错误文章hash事情spyder
1条回答
网友
1楼 · 发布于 2024-04-19 11:48:46

在Python中-1不是“保留为错误”。不知道那意味着什么。如果不允许使用-1,那么有大量的程序无法简单明了地编写。在

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

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

有可能构造大量具有相同哈希值的不相等对象,这些对象存储在字典或集合中时,会导致容器的性能大大降低,因为添加的每个对象都会导致哈希冲突,但除非您去寻找,否则您不会遇到这种情况。在

相关问题 更多 >