在我的计算机上,hash(None)
返回一个值:
>>> hash(None)
-2138947203
出于好奇,这个哈希值是如何计算的?似乎这个值不是基于None
的{{1}},因为如果我重新启动Python解释器它是相同的。
答案 0 :(得分:11)
基于None的id
,但是None是定义为C全局变量的几个Python对象之一,因此它的地址(通常)在Python之间不会改变运行。其他此类对象包括True
和False
(但这些对象是整数),或内置类,如object
和tuple
。
然而,不同的CPython构建之间的地址(和哈希)是不同的。在我的系统上,hash(None)
给出539708。
答案 1 :(得分:8)
答案 2 :(得分:2)
由于None
是一个对象,我编写了一个函数object_hash
来计算对象哈希:
import sys
import struct
def int_overflow(value):
""" simulate integer overflow """
m = sys.maxint + 1
return (value + m) % (m * 2) - m
def object_hash(value):
res = id(value)
sizeof_void_p = struct.calcsize('P')
res = int_overflow((res >> 4) | (res << (8 * sizeof_void_p - 4)))
if res == -1:
res = -2
return res
产生的哈希值相等:
>>> hash(None)
492116
>>> object_hash(None)
492116L