How is hash(None) calculated?

2020-02-13 08:11发布

On my machine, hash(None) returns a value:

>>> hash(None)
-2138947203

Just out of curiosity, how is this hash value calculated? It doesn't seem as though this value is based on None's id as it is the same if I restart the Python interpreter.

标签: python hash
3条回答
男人必须洒脱
2楼-- · 2020-02-13 08:32
ら.Afraid
3楼-- · 2020-02-13 08:41

It is based on None's id, but None is one of a few Python objects that are defined as C global variables, so its address (typically) doesn't change between Python runs. Other such objects are True and False (but these are hashed as ints), or built-in classes like object and tuple.

The address (and hash) is different between different CPython builds, however. On my system, hash(None) gives 539708.

查看更多
劳资没心,怎么记你
4楼-- · 2020-02-13 08:42

As None is an object, I've wrote a function object_hash for calculation of 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

The resulting hashes are equal:

>>> hash(None)
492116
>>> object_hash(None)
492116L
查看更多
登录 后发表回答