如何计算哈希(无)?

时间:2011-10-06 23:55:43

标签: python hash

在我的计算机上,hash(None)返回一个值:

>>> hash(None)
-2138947203

出于好奇,这个哈希值是如何计算的?似乎这个值不是基于None的{​​{1}},因为如果我重新启动Python解释器它是相同的。

3 个答案:

答案 0 :(得分:11)

基于None的id,但是None是定义为C全局变量的几个Python对象之一,因此它的地址(通常)在Python之间不会改变运行。其他此类对象包括TrueFalse(但这些对象是整数),或内置类,如objecttuple

然而,不同的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