我不确定您是否错过了该文档中“^ 表示求幂”(不是 xor)的位置。
每次通过循环,hash 的前一个值再次乘以 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 的每个值代入以下语句,将它们组合成一个语句:
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];