Меня это некоторое время беспокоит, но я пока не нашел убедительного ответа, так почему функция hashCode
в Java String не имеет ограничений по размеру? Ниже приведена реализация, которую я нашел здесь :
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
Прежде всего я понимаю использование временной переменной h
, которая имеет смысл при использовании String в нескольких потоках. Во-вторых, мы все знаем, что приведенная выше реализация не может избежать коллизий хеш-функций (ни одна реализация hashCode не может), поэтому в основном мы должны рассматривать эту функцию только как «повышение производительности», что полезно для хеш-таблиц или аналогичных структур.
Если это так, то зачем разрешать ситуацию, когда мы имеем, например, 100 МБ String и мы вычисляем хеш на основе все это символы? Разве не имеет смысла добавлять какие-то ограничения? 32/128, может быть, даже 1024 символа, но не целое значение. Длина? Да, если бы у нас было две разные строки с одинаковым префиксом, равным нашему пределу, то мы бы имели коллизию хешей, но мы все равно не можем избежать коллизий , поэтому с точки зрения производительности я бы лично изменил цикл for к чему-то вроде:
int limit = value.length > 32 ? 32 : value.length;
for (int i = 0; i < limit; i++) {
h = 31 * h + val[i];
}
Что вы думаете?