为什么 None
散列为 -1042159082
(我发现它等于 Gigabyte 的字节数取反)?
我意识到这并没有真正影响我的代码,但我很好奇。
哈希用于字典键查找,所以我决定试验一下:
>>> D = {-1042159082: 'Hello', None: 'Hi'}
>>> D[None]
'Hi'
>>> D[-1042159082]
'Hello'
>>>
我将此理解为 Python 看到两个相同的散列,然后检查类型以查看什么是什么。是吗?
>>> {False: 'Hello', 0: 'Hi'}
{False: 'Hi'}
>>> {0: 'Hi', False: 'Hello'}
{0: 'Hello'}
这很奇怪。更重要的是,第一个键保留,第二个值保留。
这是魔法吗,或者谁能帮我理解一下?
最佳答案
大约 2 个值在传递给内置 hash()
函数时可能会产生相同的输出(None
和 -1042159082
问的问题):
这称为碰撞(有关碰撞的更多信息,请参阅维基百科上的 this 页面)。
Python 使用的散列算法有一种特殊的方法来确定发生碰撞时人们真正想要的值(参见 CPython(主要 Python 解释器)源代码中的 this 页,从第 51 行开始,关于字典冲突的信息,在写这个答案的时候;this 文件也有关于字典如何实现的注释。
关于 0
和 False
会发生什么(以及更多有用的信息),请参阅当前问题的其他答案。
关于Python - 关于散列和 `None` 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5447559/