首页 > 解决方案 > 递归地为 self 中的每个对象生成哈希

问题描述

def __hash__(self):
    """Creating hash for item"""
    if isinstance(self.get_values(), (tuple, list)):

        return tuple([self.__hash__() for e in self.get_values()])

    elif not isinstance(self.get_values(), dict):

        return hash(self.get_values())

    new_o = copy.deepcopy(self.get_values())
    for k, v in new_o.items():
        new_o[k] = self.__hash__()

我有自定义递归哈希函数。Self.get_values()包含一个dicts列表。我想迭代self的每个对象并对其进行哈希处理。问题是,然后我打电话new_o[k] =self.__hash__()给例如,

我想要类似的东西self.__ hash__(v),v 可以是一个列表,我想调用我的自定义哈希函数。

取而代之的是,它再次为整个自我调用哈希,我得到递归错误。我做不到 like new_o[k] = hash(v),因为它适用于这种类型的散列函数。

标签: python

解决方案


当迭代列表/元组或项目时,您需要在迭代对象上调用 hash 方法,您一直在调用self哪个实例上调用该方法

[e.__hash__() for e in self.get_values()] # for list/tuple

new_o[k] = v.__hash__() # for k,v

给:

def __hash__(self):
    """Creating hash for item"""
    if isinstance(self.get_values(), (tuple, list)):
        return tuple([e.__hash__() for e in self.get_values()])
    elif not isinstance(self.get_values(), dict):
        return hash(self.get_values())

    new_o = copy.deepcopy(self.get_values())
    for k, v in new_o.items():
        if v: # handle empty and None
            new_o[k] = v.__hash__()

推荐阅读