Требуется доказательство / разбивка метода String.hashCode() в java

#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