hash(None)是如何计算的?

14 投票
4 回答
3517 浏览
提问于 2025-04-17 03:50

在我的电脑上,hash(None)会返回一个值:

>>> hash(None)
-2138947203

我只是好奇,这个哈希值是怎么计算出来的?看起来这个值并不是基于Noneid,因为即使我重启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运行之间是不会改变的。其他类似的对象还有TrueFalse(不过这两个是以整数形式进行哈希的),还有一些内置类,比如objecttuple

不过,不同版本的CPython之间,这个地址(和哈希值)是会不同的。在我的系统上,hash(None)的结果是539708。

撰写回答