为什么散列函数不确定?

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

我正在使用Python 3.6开发一个程序我有一个问题:如果我在同一个对象上使用确定性的hash函数(来自语言的标准库),导致输出(运行后)的字符串对于某些人来说是不同的跑!例如:

class Generic:
    def __init__(self, id, name, property):
        self.id = id 
        self.name = name
        self.property = property


def main():
    my_object = Generic(3,'ddkdjsdk','casualstring')    
    print(hash(my_object))

我希望输出始终是相同的(确定性的),但不幸的是,控制台上出现了不同的字符串:8765256330262,-9223363264515786864,-9223363262437648366和其他......为什么会发生这种情况?我希望在整个应用程序中保证使用此功能的确定性!我该如何解决这个问题?

python object hash deterministic
1个回答
0
投票

在这种情况下,最简单的方法是定义自己的__eq__函数和__hash__函数。这将每次为您返回相同的哈希:

class Generic:
    def __init__(self, id, name, property):
        self.id=id
        self.name = name
        self.property = property

    def __eq__(self, other):
        assert self.__class__ == other.__class__, "Types do not match"
        return self.id == other.id and self.name == other.name and self.property == other.property

    def __hash__(self):
        return hash ( (self.id, self.name, self.property) )

这也将使等效对象的哈希值相等:

>>>obj = Generic(1, 'blah', 'blah')
>>>obj2 = Generic(1, 'blah', 'blah')
>>>obj == obj2
True
>>>hash(obj) == hash(obj2)
True

希望有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.