代码之家  ›  专栏  ›  技术社区  ›  Seungho Lee

为什么hash()方法在Python中返回int的短哈希值?

  •  0
  • Seungho Lee  · 技术社区  · 7 年前

    什么时候? hash() int 数据类型,但带有 string 类型。

    这样行吗?如果真是这样的话 内景 输入一个短散列值,它会不会导致冲突,因为它太短了?

    for i in [i for i in range(5)]:
        print(hash(i))
    
    print(hash("abc"))
    

    0
    1
    2
    3
    4
    4714025963994714141
    
    3 回复  |  直到 7 年前
        1
  •  7
  •   ingvar    7 年前

    在CPython中,默认的Python解释器实现,内置的 hash this way :

    对于数字类型,数字x的哈希值基于缩减 hash(x)==hash(y),当x和y在数字上相等时,即使 x和y有不同的类型

    _PyHASH_BITS 61 (64位系统)或 31 (32位系统)(定义 here

    所以64位系统内置 类似于此函数:

    def hash(number):
        return number % (2 ** 61 - 1)
    

    这就是为什么对于小整数你得到相同的值,而例如 hash(2305843009213693950) 退货 2305843009213693950 hash(2305843009213693951) 退货 0

        2
  •  4
  •   chepner    7 年前

    唯一的目的 hash 函数的作用是生成一个整数值,这个整数值可以用来将一个对象插入到dict中 搞砸 保证是如果 a == b ,那么 hash(a) == hash(b) Foo Foo.__eq__ Foo.__hash__

    其他任何内容都依赖于实现,您不应该将任何内容读入 hash(x) 任何价值 x 散列(a)==散列(b) 允许 a != b hash(x) == x 对于任何特定的 .

        3
  •  0
  •   Sdrf1445    7 年前

    您应该使用hashlib模块:

    >>> import hashlib()
    >>> m.update(b'abc')
    >>> m.hexdigest()