How is the return value of __hash__ used?

前端 未结 3 1006
隐瞒了意图╮
隐瞒了意图╮ 2021-01-21 07:41

Suppose I write a class, but don\'t define a __hash__ for it. Then __hash__(self) defaults to id(self) (self\'s memory addres

3条回答
  •  无人共我
    2021-01-21 08:10

    Since Python's hash tables have a size that is a power-of-two, the lower bits of the hash value determine the location in the hash table (or at least the location of the initial probe).

    The sequence of probes into a table size of n is given by:

    def gen_probes(hashvalue, n):
        'Same sequence of probes used in the current dictionary design'
        mask = n - 1
        PERTURB_SHIFT = 5
        if hashvalue < 0:
            hashvalue = -hashvalue
        i = hashvalue & mask
        yield i
        perturb = hashvalue
        while True:
            i = (5 * i + perturb + 1) & 0xFFFFFFFFFFFFFFFF
            yield i & mask
            perturb >>= PERTURB_SHIFT
    

    For example, the dictionary:

    d = {'timmy': 'red', 'barry': 'green', 'guido': 'blue'}
    

    is stored as an array of size 8 with each entry in the form (hash, key, value):

    entries = [['--', '--', '--'],
               [-8522787127447073495, 'barry', 'green'],
               ['--', '--', '--'],
               ['--', '--', '--'],
               ['--', '--', '--'],
               [-9092791511155847987, 'timmy', 'red'],
               ['--', '--', '--'],
               [-6480567542315338377, 'guido', 'blue']]
    

    The C source code for key insertion in Python's dictionaries can be found here: http://hg.python.org/cpython/file/cd87afe18ff8/Objects/dictobject.c#l550

提交回复
热议问题