hashCode, реализация и связь с HashMap

Поэтому я задал здесь другой связанный вопрос: хеш-функция строки java с лавинным эффектом , но теперь у меня есть другой связанный с этим вопрос.

В этом вопросе я установил, что функция hashCode () для String не имеет лавинного эффекта. Это означает, например, что если у меня есть строки «k1», «k2», «k3» и я вызываю hashCode () для каждой из них, возвращаемые значения будут смежными.

Теперь, основываясь на моем воспоминании о структурах данных 101, у меня сложилось впечатление, что это плохо. Потому что, если предположить, что HashMap выбирает сегменты по алгоритму, например:

class HashMap {
    private int capacity;
    private int chooseBucket(String key) {
        return key.hashCode() % capacity;
    }
}

Это может означать, что похожие ключи хранятся в смежных сегментах, что приводит к более высокому уровню коллизий, уменьшая время поиска большого O с O (1) до ... кто знает, насколько плохо ... может быть, хуже, чем O (войти n).

Типы ответов, которые я получил на свой первый вопрос, были примерно такими: «лавинный эффект здесь не нужен», «это только для хеш-функций криптографии» и «реализация hashCode для строк выполняется быстро и хорошо работает для маленькие хеш-карты '.

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

Или я что-то упустил? Пожалуйста, просветите меня.

7
задан Community 23 May 2017 в 12:17
поделиться