Несколько причин, по которым метод hashCode может не всегда корректно вычислять хэш-код:
- Особенности входных данных. 2 Даже хорошие алгоритмы вычисления хэш-кода могут приводить к нехарактерно частым коллизиям, если во входных данных есть определённые закономерности. 2 Например, если вычислять хэш точек, складывая их x- и y-координаты, то при частом взаимодействии с точками на линии f(x) = -x (для всех них x + y == 0) вероятность коллизий будет высокой. 2
- Перемещение объектов в памяти. 4 Учитывая, что JVM будет перемещать объекты (например, при сборке мусора), после вычисления идентификационного хеша объекта нужно, чтобы он отслеживал местоположение самого объекта. 4 Например, можно взять текущую позицию объекта в памяти при первом вызове hashCode() и сохранить её где-нибудь, например в заголовке объекта. 4 Тогда при перемещении объекта в другое место с ним переедет и исходный хеш. 4
Чтобы избежать проблем с корректным вычислением хэш-кода, рекомендуется при его реализации использовать те же поля, что и для проверки на равенство, не включать изменяемые поля и не вызывать hashCode для коллекций. 2