Я читал о функциях hashcode в течение последних нескольких часов и накопил пару вопросов относительно использования простых чисел в качестве множителей в пользовательских реализациях hashcode. Я был бы признателен, если бы мог получить представление о следующих вопросах:
-
В комментарии к @mattb answer здесь @hstoerr выступает за использование больших простых чисел (например, 524287) вместо общего простого 31. Мой вопрос заключается в следующем выполнении функций хэш-кода для пары или элементов:
@Override public int hashCode() { final int prime = 31; int hash1 = (pg1 == null) ? 0 : pg1.hashCode(); int hash2 = (pg2 == null) ? 0 : pg2.hashCode(); return prime * (hash1 ^ hash2); }
не приводит ли это к переполнению возвращенного int
, если prime
- большое число?
-
Предполагая, что переполнение не является проблемой (JVM делает автоматическую подборку), лучше ли выполнять бит-брейд вместо трансляции?
-
Я полагаю, что производительность функции hashcode значительно варьируется в зависимости от сложности хэш-кода. Не влияет ли размер первичного множителя на производительность?
-
Лучше/умнее/быстрее использовать несколько простых чисел в пользовательской функции hashcode вместо одного множителя? Если нет, есть ли другое преимущество? См. Пример ниже из ответа @jinguy на соответствующий вопрос:
public int hashCode() { return a * 13 + b.hashCode() * 23 + (c? 31: 7); }
где a
является int
, b
является String
и c
является boolean
.
- Как насчет чего-то типа
long lhash = prime * (hash1 ^ hash2);
, затем используя(int)((lhash >> 32) ^ lhash)
? Это то, что я видел по другому вопросу здесь, но не было объяснено, почему было хорошей идеей сделать это так.