Объединение хеш-кодов Java в «основной» хеш-код - PullRequest
21 голосов
/ 31 мая 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

17 голосов
/ 31 мая 2010

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

3 голосов
/ 31 мая 2010

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

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

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

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