(l >> 32) ^ l
- хороший хеш-код в большинстве случаев;особенно когда long имеет равномерное распределение.
Поскольку это был принятый ответ, я публикую его, чтобы уточнить некоторые из моих комментариев о том, когда это НЕ хороший хеш-код для long.
Пример, который я привел, был классом Point следующим образом:
public class Point {
private final long coords; //x in high-bits, y in low
public int getX() {
return (int)(coords >> 32);
}
public int getY() {
return (int)coords;
}
public int hashCode() {
return (int)((coords >> 32) ^ (coords));
}
}
Может показаться надуманным, но иногда у вас есть несколько "полей", упакованных в long.
Итак, поле coords
представляет 32 бита х и 32 бита у.Так почему же это проблема?Ну, это не так, если каждый из x и y равномерно распределен по своим соответствующим 32 битам.Но на практике это маловероятно.Что более вероятно, так это то, что X и Y ограничены некоторым числом.Скажем, 1024, так как это 2 ^ 10.Это означает, что самое большее 10 младших битов каждого X и Y установлены:
00000000 00000000 000000XX XXXXXXXX 00000000 00000000 000000YY YYYYYYYY
Есть 2 ^ 20 (1024 * 1024) возможных комбинаций.Но что делает операция hashCode?
00000000 00000000 000000XX XXXXXXXX
^ 00000000 00000000 000000YY YYYYYYYY
-------------------------------------
= 00000000 00000000 000000?? ????????
Существует не более 2 ^ 10 (1024) возможных значений hashCode, поскольку только младшие 10 бит могут быть чем-либо, кроме нуля.Отношение хеш-значений к реальным значениям составляет 1024:(1024*1024)
или 1:1024
.Таким образом, сразу же существует вероятность 1/1024, что два числа имеют одинаковый хэш.
Теперь давайте вычислим вероятность столкновения, применяя математические вычисления из задачи дня рождения .Пусть p (n) - вероятность того, что при n значениях произойдет хотя бы одно столкновение.Мы знаем, что p (1025+) = 1, поскольку существует только 1024 значения.
p(n) = 1 - (n! * (1024 choose n))/1024^n
Это работает следующим образом:
n: p(n)
1: 0.00000
2: 0.00098
3: 0.00293
4: 0.00585
5: 0.00973
6: 0.01457
...
38: 0.50096
...
79: 0.95444
...
148: 0.99999
Всего 38 элементов, вероятно, естьстолкновениеС 148 предметами вероятность столкновения составляет не менее 99,999%.Каждый предмет из 148 предметов с вероятностью 7% может столкнуться с другим предметом.При правильной функции хеширования, принимая знания о домене, эти числа могут легко опуститься до 0.
Другими словами, знание вашего домена и того, как все происходит на практике, являются ключом к созданию производительного хэша.Библиотечные функции стараются выполнять как можно лучше свою работу, ничего не зная о вашем домене, и чтобы быть эффективными, как правило, полагаются на распространение данных, которое не произойдет на практике.