Хеш-функция - это способ создать компактное представление произвольно большого объема данных. В java с методом hashcode это означает, что как-то описывается состояние вашего объекта (независимо от его размера) в int (4 байта). И обычно пишется достаточно быстро, как объясняется ниже.
Чтобы упростить хеш-таблицы / хеш-карты, хеш-код служит своего рода дешевым равным. Возьмем два объекта a и b типа Foo, который позволяет say говорит, что a.equals (b) занимает 500 мс, а для вычисления (эффективного) хеш-кода требуется всего 10 мс. Поэтому, если мы хотим знать, если a.equals (b) вместо того, чтобы делать это непосредственно, мы сначала посмотрим на хеш-коды и спросим, выполняет ли a.hashCode () == b.hashCode (). Обратите внимание, что в нашем примере это займет всего 20 мс.
Из-за определения API хеш-кода мы знаем, что если хеш-код a не равен b, то a.equals (b) никогда не должно быть истинным. Так что в нашем тесте выше, если мы увидим хеш-коды неравны, тогда нам больше не нужно выполнять более длинный тест .equals (), поэтому вы всегда должны переопределять hashCode и равны вместе .
Вы также можете увидеть ссылки на написание "хороших" или "хорошо распределенных" хеш-кодов. Это связано с тем, что обратное предыдущее утверждение о хэш-коде и равно не соответствует действительности. В частности, a.hashCode () == b.hashCode () не обязательно подразумевает a.equals (b) Так что идея хорошего хеш-кода состоит в том, что вы уменьшаете вероятность a.hashCode () == b.hashCode (), когда a.equals (b) имеет значение false. Возможно, вы видели это как столкновение хэш-функции.
Вернуться к хэш-картам / таблицам. Они основаны на парах ключ / значение. Поэтому, когда вы добавляете или извлекаете значение, вы предоставляете ключ. Поэтому первое, что нужно сделать карте, - это найти ключ, что означает поиск чего-то, что .equals () дает ключ, который вы предоставляете. Но, как мы уже говорили выше, .equals () может быть невероятно медленным, что означает, что сравнение может быть значительно ускорено, если сначала проверять хеш-коды Поскольку, когда хеш-коды хорошо распределены, вы должны быстро знать, когда x определенно! = Y.
Теперь в дополнение к хеш-картам / таблицам сравнения фактически используют хеш-коды для организации своего внутреннего хранения данных, однако я думаю, что это выходит за рамки того, что вы хотите понять на данный момент.