Python 元组上的哈希输出不一致

Python 元组上的哈希输出不一致,python,hash,tuples,python-3.7,Python,Hash,Tuples,Python 3.7,比较某些两元素元组的es for i in range(11): print(i, hash((i,i)) == hash((-i,-i))) 当I==0时,我希望得到True,其余的则得到False。我很惊讶地看到: 0 True 1 False 2 True 3 True 4 True 5 True 6 True 7 True 8 False 9 True 10 True 为什么会这样 好吧,这与讨论中的问题不同,因为这不是顺序问题,而是值本身。哈希值永远不能保证无冲突,即使好的

比较某些两元素元组的es

for i in range(11):
    print(i, hash((i,i)) == hash((-i,-i)))
I==0
时,我希望得到
True
,其余的则得到
False
。我很惊讶地看到:

0 True
1 False
2 True
3 True
4 True
5 True
6 True
7 True
8 False
9 True
10 True
为什么会这样


好吧,这与讨论中的问题不同,因为这不是顺序问题,而是值本身。

哈希值永远不能保证无冲突,即使好的哈希算法努力使其无冲突。Python3.8改进了散列算法,特别是元组的散列算法,因此与Python3.7相比,Python3.8中的问题现在更难重现

摘自:

:元组的哈希函数现在基于xxHash,其中 在(以前)病理病例上提供更好的碰撞结果。 此外,在64位系统上,它通常改进了元组哈希。 杰伦·德梅尔的《补丁》,蒂姆·彼得斯的大量贡献


作为将来的参考,我最终使用以下代码进行一致元组哈希:

import hashlib
import pickle

def hash2(data):
    bytez = pickle.dumps(data)
    hashed = hashlib.md5(bytez)
    return int(hashed.hexdigest(), 16)

在Python 3.8.1中不可复制。演示:您使用的是什么版本的Python?在Python 3.7.3中,它的可复制性:例如,
hashable((2,2))==3713082714462658231,hash((2,2))=3713082714462658231
@blhsing谢谢,更改了标记