假设我有一个这样的类:
class MyClass:
def __init__(self, a):
self._a = a
我构建了这样的实例:
obj1 = MyClass(5)
obj2 = MyClass(12)
obj3 = MyClass(5)
是否有一种通用方法可以对我的对象进行哈希处理,以便使用相同值构造的对象具有相等的哈希?在这种情况下:
myhash(obj1) != myhash(obj2)
myhash(obj1) == myhash(obj3)
一般来说,我的意思是一个 Python 函数,它可以处理由我可以定义的任何类创建的对象。当然,对于不同的类和相同的值,哈希函数必须返回不同的结果;否则,这个问题将是关于几个参数的哈希。
def myhash(obj):
items = sorted(obj.__dict__.items(), key=lambda it: it[0])
return hash((type(obj),) + tuple(items))
此解决方案显然有局限性:
- 它假定
__dict__
中的所有字段都很重要。 - 它假设存在
__dict__
,例如,这不适用于__slots__
。 - 它假定所有值都是可哈希的
- 它打破了利斯科夫替代原则。
这个问题的格式很糟糕,原因有几个:
- 哈希不测试等式,只测试不平等。 也就是说,他们保证
hash(a) != hash(b)
意味着a != b
,但反之则不成立。 例如,选中"aKey" in myDict
将对myDict
中与"aKey"
具有相同哈希的所有键进行线性搜索。 - 您似乎想对存储做点什么。 请注意,
"aKey"
的哈希将在运行之间更改,因此不要将其写入文件。 有关详细信息,请参阅__hash__
底部。 - 通常,您需要仔细考虑子类、哈希和相等性。 这里有一个坑,所以即使是官方文档也悄悄地回避了实例哈希的含义。 请注意,每个实例都有一个局部变量
__dict__
和包含更多信息的__class__
。
希望这对那些追随你的人有所帮助。