Я знаю, что формула, принятая для метода String.hashCode(), выглядит следующим образом:
S0x31(n-1)+s1x31(n-2)+…+s(n-1)
В моем учебнике мне дан пример слова Кошка.
'C' x31^2 + 'a' x 31 +t
Окончательное значение указано как 67,510
Я совершенно не понимаю, откуда было получено это значение, в частности, какие значения использовались для отдельных символов. Я пробовал 37, 66 и 85 (используя символ Unicode для заглавной буквы C, строчные буквы a и t соответственно). Это было недействительно. Может ли кто-нибудь осветить это для меня?
К сожалению, это единственный пример, приведенный в моем учебнике, и нет попытки его прояснить или объяснить.
Десятичные значения, я неправильно интерпретировал таблицу. Спасибо.
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/
Строка hashCode делает:
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;
}
Таким образом, на каждой итерации существующий хэш умножается на 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
Откуда именно вы взяли эти значения? 37, 66 и 85 то есть? Если вы посмотрите на ASCII-таблица, значения равны 67, 97 и 116 соответственно. Мне кажется, это правильно.