为什么hash()方法在Python中使用int返回简短的Hash值?

时间:2018-11-07 16:58:37

标签: python hash types

在Python 3中调用hash()方法时,我注意到在使用int类型的string数据类型时,它不会返回长整数。

这应该以这种方式工作吗?如果确实如此,对于int类型具有短哈希值,由于它太短而不会引起冲突吗?

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

print(hash("abc"))

结果:

0
1
2
3
4
4714025963994714141

3 个答案:

答案 0 :(得分:4)

insert函数的唯一用途是产生一个整数值,该整数值可用于将对象插入到dict中。 create唯一保证的是,如果hash,则hash。对于用户定义的类a == b,确保hash(a) == hash(b)Foo强制执行此保证是用户的责任。

其他任何事情都依赖于实现,对于任何值Foo.__eq__,您都不应将任何内容读入Foo.__hash__的值中。具体来说,hash(x)允许使用x,任何特定hash(a) == hash(b)都不需要a != b

答案 1 :(得分:3)

在CPython中,默认的Python解释器实现内置hashthis way中完成:

  

对于数字类型,数字x的哈希值基于减少量      x以质数P = 2 ** _ PyHASH_BITS-1为模。      hash(x)== hash(y)只要x和y在数值上相等,即使      x和y具有不同的类型

_PyHASH_BITS61(64位系统)或31(32位系统)(定义为here

因此,在64位系统上,内置hash类似于以下功能:

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

这就是为什么对于小整数您具有相同的值的原因,例如hash(2305843009213693950)返回2305843009213693950,而hash(2305843009213693951)返回0

答案 2 :(得分:0)

您应该使用hashlib模块:

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