为什么hash(None)会在不同平台和不同调用中发生变化?

时间:2015-07-01 21:26:23

标签: python hash python-internals

我在Python上使用哈希函数面对一个非常奇怪的行为。当我在Mac OS(10.10)上运行以下命令时,我从不同的调用中获得不同的值。

$ python -c "print hash(None)"
-9223372036579216774
$ python -c "print hash(None)"
-9223372036582852230

另一方面,当我在Ubuntu 14.04上运行相同的东西时,我得到:

$ python -c "print hash(None)"
596615
$ python -c "print hash(None)"
596615

对于我而言,在OS X中,python以某种方式使用内存地址而Ubuntu则不然。从中我可以看出哈希函数可能依赖于实现。但不应该基于"价值"只有?这些数字代表什么?为什么即使在相同的python版本上,但在不同的操作系统上它的行为也不同?

1 个答案:

答案 0 :(得分:2)

None.__hash___Py_HashPointer哈希函数相关联。所以基本上对象的指针用作哈希。对于None使用单身人士来说这是安全的,但不是确定性的。对于转换为适当整数类型p的指针,哈希值的计算方式如下:

    (p >> 4) | (p << (8 * SIZEOF_VOID_P - 4))

请参阅此源代码中的注释:

  

底部3或4位可能为0;将y旋转4以避免dicts和sets的过多哈希冲突