gpt4 book ai didi

python - python中默认的__hash__是什么?

转载 作者:IT老高 更新时间:2023-10-28 21:35:31 26 4
gpt4 key购买 nike

我经常使用时髦的东西作为字典的键,因此,我想知道正确的方法是什么 - 这通过为我的对象实现良好的哈希方法。我知道这里提出的其他问题,例如 good way to implement hash ,但我想了解默认 __hash__ 如何用于自定义对象,以及是否可以依赖它。

我注意到可变对象是明确不可散列的,因为 hash({}) 会引发错误......但奇怪的是,自定义类是可散列的:

>>> class Object(object): pass
>>> o = Object()
>>> hash(o)

那么,有人知道这个默认哈希函数是如何工作的吗?通过了解这一点,我想知道:

如果我将相同类型的对象作为字典的键,我可以依赖这个默认哈希吗?例如:

key1 = MyObject()
key2 = MyObject()
key3 = MyObject()
{key1: 1, key2: 'blabla', key3: 456}

如果我使用不同类型的对象作为字典中的键,我可以依赖它吗?例如

{int: 123, MyObject(10): 'bla', 'plo': 890}

在最后一种情况下,如何确保我的自定义哈希不会与内置哈希冲突?例如:

{int: 123, MyObject(10): 'bla', MyObjectWithCustomHash(123): 890}

最佳答案

您可以依赖什么:自定义对象有一个默认的 hash(),它以某种方式基于对象的身份。即,任何使用默认哈希的对象在其生命周期内都将具有该哈希的常量值,并且不同的对象可能具有也可能没有不同的哈希值。

您不能依赖 id() 返回的值与 hash() 返回的值之间的任何特定关系。在 Python 2.6 及更早版本的标准 C 实现中,它们在 Python 2.7-3.2 中是相同的 hash(x)==id(x)/16

编辑:最初我写道,在 3.2.3 及更高版本或 2.7.3 或更高版本中,哈希值可能是随机的,而在 Python 3.3 中,这种关系将始终是随机的。事实上,目前随机化只适用于散列字符串,所以实际上除以 16 的关系可能会继续存在,但不要指望它。

哈希冲突通常无关紧要:在字典查找中查找对象必须具有相同的哈希并且还必须比较相等。仅当您遇到非常高比例的冲突(例如导致最近版本的 Python 能够随机化哈希计算的拒绝服务攻击)时,冲突才有意义。

关于python - python中默认的__hash__是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11324271/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com