我编写了一个.__hash__()
实现需要很长时间才能执行的类。我一直在考虑缓存其哈希值,并将其存储在._hash
之类的变量中,以便.__hash__()
方法只返回._hash
。 (将在.__init__()
结束时或第一次调用.__hash__()
时计算。
我的理由是:“这个对象是不可变的 - >它的哈希值永远不会改变 - >我可以缓存哈希值。”
但现在让我思考:你可以对任何哈希对象说同样的话。 (除了散列为其id的对象外。)
那么不是否有理由缓存对象的哈希值,除了哈希计算速度非常快的小对象?
答案 0 :(得分:9)
当然,缓存哈希值很好。实际上,Python对字符串本身也这样做。权衡取决于哈希计算的速度和保存哈希值所需的空间。这种权衡就是为什么元组不会缓存它们的哈希值,而是字符串呢(参见request for enhancement #1462796)。
答案 1 :(得分:0)
通常的原因是Python中的大多数对象都是可变的,因此如果散列取决于属性,则在更改属性后它会立即更改。如果你的类确实是一个不可变的(并且所有进入哈希的属性也是不可变的!),那么你可以缓存哈希值。
答案 2 :(得分:-1)
hash(obj) == id(obj)
通常不适用:
>>> class A(object): pass
...
>>> a = A()
>>> hash(a), id(a)
(8762051845337, 140192829525392)