Как я могу хешировать объект с двумя симметрично эквивалентными характеристиками? - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть объект (Edge), который содержит два других объекта (точки A и B) в 3D.Геометрически ребро от A = (0, 0, 0) до B = (1, 0, 0) должно быть таким же, как ребро от A = (1, 0, 0) до B = (0, 0, 0), и легко сделать утверждение равенства двух ребер.Однако у меня возникли некоторые концептуальные проблемы, связанные с реализацией способа хеширования этого объекта (в Python).Например, hash ((A, B)) вернет значение, отличное от hash ((B, A)).

Я видел ответы о похожих проблемах на этом сайте, но все они включают созданиесравнение между двумя элементами.Я действительно не хочу этого делать, потому что, хотя я могу придумать строгий способ сравнения двух точек (сначала сравните координаты x, затем координаты y, если x равны, затем z, если y равны), я неНе знаю, хочу ли я осуществить сравнение, которое математически кажется бессмысленным и полезным только для этого единственного экземпляра.Утверждение (1, 0, 0)> (0, 300, 10 ^ 10) может быть правильным с этим методом, но оно не очень значимо.

class Edge(object):
    def __init__(self, pointA, pointB):
        self._A = pointA
        self._B = pointB
        ab = pointA + pointB
        self._midpoint = Vector(ab.x / 2, ab.y / 2, ab.z / 2)


    def get_A(self):
        return self._A

    def set_A(self, point):
        self._A = point

    def get_B(self):
        return self._B

    def set_B(self, point):
        self._B = point

    A = property(get_A, set_A)
    B = property(get_B, set_B)

    def __eq__(self, other):
        if isinstance(other, Edge):
            if (self.A == other.A) and (self.B == other.B):
                return True
            elif (self.B == other.A) and (self.A == other.B):
                return True
            else:
                return False

    def __ne__(self, other):
        return not self.__eq__(other)

    def __hash__(self):
        return hash((self.A, self.B)) # =/= hash((self.B, self.A))!

    def __str__(self):
        return "[{}, {}]".format(self.A, self.B)

В заключение мне интересноесли есть реализация, которая даст двум эквивалентным ребрам одинаковое хеш-значение без создания какой-либо произвольной функции сравнения между точками.(PS мой класс "point" называется "Vector")

1 Ответ

0 голосов
/ 17 февраля 2019

Объедините хэши A и B с XOR:

def __hash__(self):
    return hash(self.A) ^ hash(self.B)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...