Объединение хэш-кодов 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(), я не знаю, нужно ли это, но лучше быть в безопасности, чем извините, когда пытаетесь избежать общих факторов, я думаю - поскольку я предположим, именно поэтому простые числа популярны для хэш-функций.)
Ответы
Ответ 1
Это нормальная практика. Это выглядит довольно разумно для меня. Если вы используете Eclipse, вы должны обнаружить, что он может генерировать equals
и hashCode
для вас - просто проверьте меню "Источник". Он будет делать то же самое: перечислите свои поля и создайте метод equals
, который проверит их все, затем выберите n простых чисел и сделайте то, что вы сделали, чтобы создать метод hashCode
.
Ответ 2
Причиной использования простых чисел (они не обязательно должны быть "большие" простые числа), действительно, следует избегать общих факторов.
Коды хэша используются классами сбора на основе хешей, такими как HashSet
и HashMap
. Они лучше всего работают, если хэш-коды объектов на карте настолько разнообразны (они должны делать больше работы, чтобы различать объекты, если хэш-код этих объектов одинаковый).
Умножение хэш-кодов частей, которые вы используете для создания комбинированного хеш-кода с помощью простых чисел, гарантирует, что части не будут иметь общих факторов, поэтому вероятность появления коллизий меньше (в отношении хэш-кодов разных частей, перекрывающих друг друга).