#java #hashcode
#java #хэш-код
Вопрос:
Я знаю, что формула, принятая для метода String.hashCode(), выглядит следующим образом:
S0x31(n-1) s1x31(n-2) … s(n-1)
В моем учебнике мне приведен пример слова Cat .
'C' x31^2 'a' x 31 t
Конечное значение задается как 67,510
Я совершенно не понимаю, откуда было получено это значение, в частности, какие значения использовались для отдельных символов. Я пробовал 37, 66 и 85 (используя символ Юникода для заглавных букв C, строчных букв a и t соответственно). Это было недопустимо. Может кто-нибудь осветить это для меня?
К сожалению, это единственный пример, приведенный в моем учебнике, и нет никаких попыток его прояснить или объяснить.
Комментарии:
1. Откуда именно вы получили эти значения? 37, 66 и 85 то есть? Если вы посмотрите на таблицу ASCII , значения равны 67, 97 и 116 соответственно. Мне кажется, это правильно.
2. Десятичные значения, я неправильно интерпретировал таблицу. Спасибо.
Ответ №1:
67 * 31^2 97 * 31^1 116 * 31^0 =
67 * 31^2 97 * 31 116 =
64387 3007 116 =
67510
С 67, 97 и 116, взятыми из http://www.asciitable.com /
Ответ №2:
Строковый хэш-код выполняет:
public int hashCode() {
int h = hash;
if (h == 0 amp;amp; value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i ) {
h = 31 * h val[i];
}
hash = h;
}
return h;
}
Таким образом, в основном на каждой итерации существующий хэш умножается на 31, а затем к хэшу добавляется следующее значение.
итак, с ‘C’ = 67, ‘a’ = 97, ‘t’ = 116 вы получаете:
h = 0
h *= 31;
h = 67; // 'C'
h *= 31;
h = 97; // 'a'
h *= 31;
h = 116;
h ==> 67510