Поэтому я задал здесь другой связанный вопрос: хеш-функция строки 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 действительно имеет значение, не так ли?
Или я что-то упустил? Пожалуйста, просветите меня.