在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
答案 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解释器实现内置hash
在this way中完成:
对于数字类型,数字x的哈希值基于减少量 x以质数P = 2 ** _ PyHASH_BITS-1为模。 hash(x)== hash(y)只要x和y在数值上相等,即使 x和y具有不同的类型
_PyHASH_BITS
是61
(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()