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