How is hash(None) calculated?

前端 未结 3 1777
半阙折子戏
半阙折子戏 2020-12-20 13:51

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

>>> hash(None)
-2138947203

Just out of curiosity, how is this hash value c

相关标签:
3条回答
  • 2020-12-20 13:59

    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.

    0 讨论(0)
  • 2020-12-20 14:02

    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
    
    0 讨论(0)
  • 2020-12-20 14:24

    It's based on the address of None in memory, as the type definition says.

    0 讨论(0)
提交回复
热议问题