Python 中是否有类实例的哈希值?



假设我有一个这样的类:

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__

希望这对那些追随你的人有所帮助。

最新更新