Что такое переменные "offset" и "hash" в String.hashCode()?

Я читал, что это исходный код для String.hashCode()

   public int hashCode() {
   int h = hash;
   if (h == 0) {
       int off = offset;
       char val[] = value;
       int len = count;

       for (int i = 0; i < len; i++) {
           h = 31*h + val[off++];
       }
       hash = h;
   }
   return h;
   }

Мой вопрос: что такое "смещение" и "хэш"? Я могу сказать, что "значение" - это фактическая строка, а "длина" - ее длина, но я не понимаю, что представляют собой две другие.

Ответ 1

Смещение является первым индексом массива value [] символов строки. Хэш-переменная является полем для кэширования хэш-кода, чтобы быть более эффективным (метод hashCode() вычисляет хэш только в том случае, если текущее значение равно 0, а другое - кеш-кеш)