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

时间:2010-09-24 13:13:39

标签: python caching hash

我编写了一个.__hash__()实现需要很长时间才能执行的类。我一直在考虑缓存其哈希值,并将其存储在._hash之类的变量中,以便.__hash__()方法只返回._hash。 (将在.__init__()结束时或第一次调用.__hash__()时计算。

我的理由是:“这个对象是不可变的 - >它的哈希值永远不会改变 - >我可以缓存哈希值。”

但现在让我思考:你可以对任何哈希对象说同样的话。 (除了散列为其id的对象外。)

那么是否有理由缓存对象的哈希值,除了哈希计算速度非常快的小对象?

3 个答案:

答案 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)