Смотрю исходники Java: реализация бакетов HashMap — почему HashCode снова «хэшируется»?

Посмотрел реализацию HashMap в исходниках Java и вот что увидел:

private static int hash(Object x, int length) {
        int h = System.identityHashCode(x);
        // Multiply by -127, and left-shift to use least bit as part of hash
        return ((h << 1) - (h << 8)) & (length - 1);
    }

Вопрос по последней строчке.
Как видно, для получения индекса нужного бакета, у хэш-кода отбрасываются старшие биты с помощью логического AND. Но что это за манипуляции со сдвигами?

1. Как математически доказать, что это лучше простого отбрасывания битов (без этих манипуляций)?
2. Это преобразование могло бы иметь смысл, чтобы увеличить вклад старших битов хешкода, но здесь этого не происходит. Или я ошибаюсь?
3. И еще странность - System.identityHashCode(x) - это де-факто его адрес в памяти. Получается, что HashMap не использует переопределенный HashCode потомка? Или я не тот кусок кода смотрю?
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
8BIT GROUP Москва
от 180 000 до 280 000 руб.
Innopolis City Москва
от 80 000 до 170 000 руб.
Ditrix Москва
от 120 000 руб.
19 марта 2019, в 22:30
5000 руб./за проект
19 марта 2019, в 21:07
9000 руб./за проект