Python:有什么理由*不*缓存对象的哈希?

问题描述 投票:12回答:3

我编写了一个类,该类的.__hash__()实现需要很长时间才能执行。我一直在考虑缓存其哈希,并将其存储在类似._hash的变量中,因此.__hash__()方法将仅返回._hash。 (将在.__init__()的结尾或首次调用.__hash__()时进行计算。)

我的推理是:“此对象是不可变的->其哈希永远不会改变->我可以缓存该哈希。”

但是现在让我开始思考:您可以对any可哈希对象说同样的话。 (除了散列为其ID的对象之外。)

因此,除了散列计算速度非常快的小对象之外,是否有理由not来缓存对象的哈希?

python caching hash
3个回答
10
投票

当然,可以缓存哈希值。实际上,Python本身就是这样做的。折衷是在哈希计算的速度和保存哈希值所需的空间之间。例如,这种权衡就是为什么元组不缓存其哈希值,而字符串缓存的原因(请参见request for enhancement #1462796)。


1
投票

通常的原因是Python中的大多数对象都是可变的,因此,如果哈希取决于属性,则更改属性后它就会立即更改。如果您的类确实是不可变的(并且哈希中的所有属性也都是不可变的!),则可以缓存哈希。


0
投票

hash(obj) == id(obj)通常不成立:

    >>> class A(object): pass
    ... 
    >>> a = A()
    >>> hash(a), id(a)
    (8762051845337, 140192829525392)
© www.soinside.com 2019 - 2024. All rights reserved.