hash(None)是如何计算的?
在我的电脑上,hash(None)
会返回一个值:
>>> hash(None)
-2138947203
我只是好奇,这个哈希值是怎么计算出来的?看起来这个值并不是基于None
的id
,因为即使我重启Python解释器,这个值也是一样的。
4 个回答
3
因为 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
8
这段话是说,在内存中,None
的地址是基础,因为类型定义中提到了这一点。
13
这个内容是说,None的id
是基于它的地址的,但None是少数几个在Python中被定义为C语言全局变量的对象之一,所以它的地址(通常情况下)在不同的Python运行之间是不会改变的。其他类似的对象还有True
和False
(不过这两个是以整数形式进行哈希的),还有一些内置类,比如object
和tuple
。
不过,不同版本的CPython之间,这个地址(和哈希值)是会不同的。在我的系统上,hash(None)
的结果是539708。