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

Я знаю, что формула, принятая для метода 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 соответственно). Это было недействительно. Может ли кто-нибудь осветить это для меня?

К сожалению, это единственный пример, приведенный в моем учебнике, и нет попытки его прояснить или объяснить.

Откуда именно вы взяли эти значения? 37, 66 и 85 то есть? Если вы посмотрите на ASCII-таблица, значения равны 67, 97 и 116 соответственно. Мне кажется, это правильно.

Amongalen 09.04.2019 12:30

Десятичные значения, я неправильно интерпретировал таблицу. Спасибо.

Jack White 09.04.2019 12:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
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

Другие вопросы по теме