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

hug*_*gos 13 python hash python-internals

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

$ python -c "print hash(None)"
-9223372036579216774
$ python -c "print hash(None)"
-9223372036582852230
Run Code Online (Sandbox Code Playgroud)

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

$ python -c "print hash(None)"
596615
$ python -c "print hash(None)"
596615
Run Code Online (Sandbox Code Playgroud)

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

tyn*_*ynn 2

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

    (p >> 4) | (p << (8 * SIZEOF_VOID_P - 4))
Run Code Online (Sandbox Code Playgroud)

源代码中的注释指出:

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