Python: почему хеш-функция не является детерминированной? - PullRequest
0 голосов
/ 11 марта 2019

Я занимаюсь разработкой программы с использованием 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 и другие ... Почему это происходит?Я хотел бы гарантировать детерминизм с этой функцией на протяжении всего моего приложения!Как мне решить проблему?Большое спасибо!

1 Ответ

0 голосов
/ 11 марта 2019

В этом случае, вероятно, проще всего определить собственную функцию __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

надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...