代码之家  ›  专栏  ›  技术社区  ›  Ram Rachum

Python:有没有理由*不*缓存对象的散列?

  •  11
  • Ram Rachum  · 技术社区  · 15 年前

    我写了一个班级 .__hash__() ._hash .\uuu散列() 方法将简单地返回 . (将在 .__init__() .\uuu散列() 被称为。)

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

    但现在这让我想到:你也可以这么说 任何 哈希对象。(哈希为其id的对象除外。)

    要缓存对象的哈希,除了哈希计算非常快的小对象?

    2 回复  |  直到 15 年前
        1
  •  11
  •   Cristian Ciupitu    10 年前

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

        2
  •  -1
  •   Aaron Digulla    15 年前

        3
  •  -2
  •   Pearu    6 年前

    hash(obj) == id(obj) 通常不适用于:

        >>> class A(object): pass
        ... 
        >>> a = A()
        >>> hash(a), id(a)
        (8762051845337, 140192829525392)