我正在使用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和其他......为什么会发生这种情况?我希望在整个应用程序中保证使用此功能的确定性!我该如何解决这个问题?
在这种情况下,最简单的方法是定义自己的__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
希望有所帮助!