如何计算python类对象的哈希

时间:2018-12-13 17:47:13

标签: python oop hash md5

在python3中,我有一个类。如下所示:

class Foo:
    def __init__(self):
        self.x = 3
    def fcn(self, val):
        self.x += val

然后我实例化该类的对象,如下所示:

new_obj = Foo()
new_obj2 = Foo()

现在,当我对这些对象进行哈希处理时,会得到不同的哈希值。我需要它们返回相同的哈希值,因为它们是相同的对象(理论上)。

你知道我该怎么做吗?

3 个答案:

答案 0 :(得分:1)

它们不是是同一对象。表达式Foo()调用类构造函数Foo.__init__,该构造函数在每次调用时返回对象的新的,唯一的实例。您的两次调用返回两个独立的对象,它们位于不同的内存位置,每个对象包含其自己的x属性的私有实例。

您可能想了解Python类和实例理论。

答案 1 :(得分:0)

class Foo:
    def __init__(self):
        self.x = 3
    def fcn(self, val):
        self.x += val
    def __hash__(self):
        return hash(self.x)

这将使用self.x计算哈希值;这意味着当self.x相同时,哈希将相同。您可以从__hash__返回任何内容,但为防止一致性错误,如果对象比较相等,则应返回相同的哈希值。有关in the docs的更多信息。

答案 2 :(得分:0)

感谢所有回答的人。没错,实例化同一类对象的新实例实际上并不完全相同,因为它在内存中所占的位置不同。我最终要做的事情类似于@nosklo的建议。

我创建了一个'get_hashables'函数,该函数返回一个字典,该字典包含将构成唯一类对象的类的所有属性,如下所示:

def get_hashables(self):
    return {'data': self.data, 'result': self.result}

然后我的main方法将使用这些“可哈希”变量,并对它们进行哈希处理以产生哈希本身。