在 java 中需要 proof/breakdown 的 String.hashCode() 方法
Need proof/breakdown of String.hashCode() method in java
我知道String.hashCode()方法采用的公式如下:
S0x31(n-1)+s1x31(n-2)+…+s(n-1)
在我的教科书中,给我举了猫这个词的例子。
'C' x31^2 + 'a' x 31 +t
最终值为67,510
我对这个值的来源感到非常困惑,具体来说,是什么值用于各个字符。我试过 37、66 和 85(分别使用大写 C、小写 a 和 t 的 Unicode 字符)。这是无效的。有人可以帮我解释一下吗?
遗憾的是,这是我的教科书给出的唯一例子,并没有试图澄清或解释它。
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/
String 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
我知道String.hashCode()方法采用的公式如下:
S0x31(n-1)+s1x31(n-2)+…+s(n-1)
在我的教科书中,给我举了猫这个词的例子。
'C' x31^2 + 'a' x 31 +t
最终值为67,510
我对这个值的来源感到非常困惑,具体来说,是什么值用于各个字符。我试过 37、66 和 85(分别使用大写 C、小写 a 和 t 的 Unicode 字符)。这是无效的。有人可以帮我解释一下吗?
遗憾的是,这是我的教科书给出的唯一例子,并没有试图澄清或解释它。
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/
String 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