在Python中有没有办法用已知的哈希值查询dict / set

问题描述 投票:2回答:1

假设对象a具有非常昂贵的散列函数,并且我希望在不同的dicts或集合中查询a。如果我天真地做:

d1_res = d1[a]
d2_res = d2[a]

我要做两次哈希。我希望的是:

编辑:原始问题中的以下代码是错误的!

hashvalue = hash(a)
d1_res = d1.getitem(a, hashvalue=hash)
d2_res = d2.getitem(a, hashvalue=hash)

编辑:这是正确的示例代码

hashvalue = hash(a)
d1_res = d1.getitem(a, hashvalue=hashvalue)
d2_res = d2.getitem(a, hashvalue=hashvalue)

因此我只需要做一个哈希。这有什么办法吗?或者是否存在任何阻止此类界面的基础Python机制?

编辑:以下信息很重要

一个简单的解决方案似乎将哈希结果缓存在__hash__方法中,但我的示例是简化的。实际上,我的实际情况中的哈希函数并不昂贵(只是int哈希)。但是散列已经进行了很多次,我想减少费用。我正在编写C / C ++扩展,所以我正在寻找任何可能的性能改进。

提前致谢。

python hash
1个回答
2
投票

这是一个想法,它将使用对象本身(dict键)来保持其哈希值。

dict实现不应该知道 - 它只会调用hash。

每个'setter'都会使缓存的哈希值为None,并强制重新计算。

class MyComplexObject:
    def __init__(self, name, size):
        self._name = name
        self._size = size
        self.hash_value = None

    def __hash__(self):
        if self.hash_value is None:
            #  heavy calculations goes here
            #  the result of the calculations is 7 (as an example)
            self.hash_value = 7
        return self.hash_value

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name
        self.hash_value = None

    @property
    def size(self):
        return self._size

    @size.setter
    def size(self, size):
        self._size = size
        self.hash_value = None
© www.soinside.com 2019 - 2024. All rights reserved.