Я не уверен, что вы пропустили, где в этой документации написано "^ означает возведение в степень" (не xor).
Каждый раз в цикле предыдущее значение хеша умножается на 31 снова перед добавлением к следующему элементу value
.
Можно было бы доказать, что эти вещи равны по индукции, но я думаю, что пример может быть более
ясно:
Скажем, мы имеем дело со строкой из 4 символов. Давайте развернем цикл:
hash = 0;
hash = 31 * hash + value[0];
hash = 31 * hash + value[1];
hash = 31 * hash + value[2];
hash = 31 * hash + value[3];
Теперь объедините их в один оператор, подставив каждое значение хэша в следующий оператор:
hash = 31 * (31 * (31 * (31 * 0 + value[0]) + value[1]) + value[2])
+ value[3];
31 * 0 равно 0, поэтому упростите:
hash = 31 * (31 * (31 * value[0] + value[1]) + value[2])
+ value[3];
Теперь умножьте два внутренних члена на эту секунду 31:
hash = 31 * (31 * 31 * value[0] + 31 * value[1] + value[2])
+ value[3];
Теперь умножьте три внутренних члена на эти первые 31:
hash = 31 * 31 * 31 * value[0] + 31 * 31 * value[1] + 31 * value[2]
+ value[3];
и преобразовать в экспоненты (больше не Java):
hash = 31^3 * value[0] + 31^2 * value[1] + 31^1 * value[2] + value[3];