Какой алгоритм используется для генерации hashCode

«Какой алгоритм используется для генерации hashCode» — вопрос из категории Java, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Java для генерации hashCode() у String используется полиномиальный алгоритм (хэш-функция на основе 31-го числа). Формула:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

Пример:

val str = "abc"
println(str.hashCode()) // 96354 = 97*31² + 98*31 + 99

Нюансы:

  • Число 31 выбрано как нечётное простое, оптимизирует коллизии и производительность (сдвиг: 31 * i == (i << 5) - i).
  • Для Object по умолчанию используется System.identityHashCode() (адрес в памяти, но не всегда).
  • Переопределяя hashCode(), нужно соблюдать контракт: если a.equals(b), то a.hashCode() == b.hashCode().

Код переопределения:

override fun hashCode(): Int {
    return Objects.hash(field1, field2) // или своя логика
}