我在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版本上,但在不同的操作系统上它的行为也不同?
答案 0 :(得分:2)
None.__hash__
与_Py_HashPointer
哈希函数相关联。所以基本上对象的指针用作哈希。对于None
使用单身人士来说这是安全的,但不是确定性的。对于转换为适当整数类型p
的指针,哈希值的计算方式如下:
(p >> 4) | (p << (8 * SIZEOF_VOID_P - 4))
请参阅此源代码中的注释:
底部3或4位可能为0;将y旋转4以避免dicts和sets的过多哈希冲突