Подтвердить что ты не робот

Объединение хэш-кодов Java в "главный" хэш-код

У меня есть векторный класс с hashCode(). Он не был написан мной, но использует 2 простых числа, с помощью которых можно умножить 2 векторных компонента до их XORing. Вот он:

    /*class Vector2f*/
...
    public int hashCode()
    {
        return 997 * ((int)x) ^ 991 * ((int)y); //large primes! 
    }

... Поскольку это из установленной библиотеки Java, я знаю, что она работает нормально.

Тогда у меня есть класс Boundary, который содержит 2 вектора, "start" и "end" (представляющий конечные точки строки). Значения этих двух векторов характеризуют границу.

    /*class Boundary*/
...
    public int hashCode()
    {
        return 1013 * (start.hashCode()) ^ 1009 * (end.hashCode());
    }

Здесь я попытался создать хороший hashCode() для уникального 2-кортежа векторов (начало и конец), составляющих эту границу. Мой вопрос: будет ли эта реализация hashCode() работать?

(Обратите внимание, что я использовал 2 разных простых числа в последней реализации hashCode(), я не знаю, нужно ли это, но лучше быть в безопасности, чем извините, когда пытаетесь избежать общих факторов, я думаю - поскольку я предположим, именно поэтому простые числа популярны для хэш-функций.)

4b9b3361

Ответ 1

Это нормальная практика. Это выглядит довольно разумно для меня. Если вы используете Eclipse, вы должны обнаружить, что он может генерировать equals и hashCode для вас - просто проверьте меню "Источник". Он будет делать то же самое: перечислите свои поля и создайте метод equals, который проверит их все, затем выберите n простых чисел и сделайте то, что вы сделали, чтобы создать метод hashCode.

Ответ 2

Причиной использования простых чисел (они не обязательно должны быть "большие" простые числа), действительно, следует избегать общих факторов.

Коды хэша используются классами сбора на основе хешей, такими как HashSet и HashMap. Они лучше всего работают, если хэш-коды объектов на карте настолько разнообразны (они должны делать больше работы, чтобы различать объекты, если хэш-код этих объектов одинаковый).

Умножение хэш-кодов частей, которые вы используете для создания комбинированного хеш-кода с помощью простых чисел, гарантирует, что части не будут иметь общих факторов, поэтому вероятность появления коллизий меньше (в отношении хэш-кодов разных частей, перекрывающих друг друга).