См. Эффективную Java-версию Блоха # 9.
Но вы должны начать с начального значения (так что последующие нулевые значения значительны) и объединить поля, которые применяются к результату, вместе с множителем, чтобы порядок был значительным (так что аналогичные классы будут иметь очень разные хэши .)
Кроме того, вам придется обрабатывать такие вещи, как длинные поля и струны, несколько иначе. например, для длинных позиций:
(int) (field^(field>>>32))
Таким образом, это означает что-то вроде:
@Override public int hashCode() {
int result = 17;
result += name.hashCode() == null ? 0 : name.hashCode();
result = 31 * result + (int) (DoB^(DoB >>> 32));
return result;
}
31 немного магии, но нечетные простые числа могут сделать его проще для компилятора, чтобы оптимизировать математику перекладывать-вычитание. (Или вы можете сделать смену вычитания самостоятельно, но почему бы не позволить компилятору сделать это.)
'equals' override. Вы можете захотеть умножить длинный на что-то нечетное, например, 31. –
нет, этого не будет. 'hash (a) + hash (b)! = hash (a + b)'. в то время как не совсем легко сделать, кто-то, возможно, мог бы найти совершенно другую строку SINGLE, которая хэшируется с тем же значением, что и ваш комбинированный хэш (a) + hash (b). –
@DaveNewton У меня тоже равное переопределение. следует добавить его к вопросу? – nafas