String哈希合并到主哈希中

时间:2018-03-11 18:41:56

标签: java string hashcode

两个String对象的哈希值的合并是否应与其串联的哈希值相同?我正在使用XOR ^运算符(如建议here)并获得了不同的结果。

我做错了什么?

String a = "A";
String b = "B";
String ab = a+b;
int i = a.hashCode() ^ b.hashCode();

System.out.println(
    a.hashCode()+"\n"+
    b.hashCode()+"\n"+
    ab.hashCode()+"\n"
    i);

1 个答案:

答案 0 :(得分:1)

问题的前提是错误的。 hashCode()唯一的硬性要求是两个相等的对象(即,调用a.equals(b)返回true)具有相同的哈希码(即a.hashCode() == b.hashCode()返回true }。

事实上,通过阅读String#hashCode()'s javadoc,它说明了:

  

String对象的哈希码计算为
  s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

     

使用int算术,其中s [i]是字符串的第i个字符,n是字符串的长度,^表示取幂。 (空字符串的哈希值为零。)

很明显,对两个字符串进行连接不会产生一个字符串,该字符串的哈希码等于构成它的字符串的哈希码的xor。