【问题标题】:Merge of String hashes into master hash将字符串哈希合并到主哈希中
【发布时间】:2018-03-11 18:41:56
【问题描述】:

两个 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);

【问题讨论】:

  • 没有。为什么你会期望它们是一样的?你检查过String.hashCode() 的文档吗?
  • “我做错了什么?” 你的想法,就是你做错了什么。为什么你会认为异或哈希是一样的。 String 可以以任何它想要的方式创建散列。如果它想(它不会,太慢),它可以通过加密函数发送文本。但就你而言,它也可能有。您永远不应该期望特定文本有任何特定的哈希值。新版本的 Java 甚至可能会改变所使用的算法。
  • @Andreas 不是。该算法在文档中。现在无法更改。
  • @shmosel 从技术上讲,没有什么能阻止新的 Java SE 版本 JSR 或 JEP 更改算法。
  • @MarkRotteveel 从技术上讲,没有什么能阻止下一个 JLS 交换 truefalse 的含义。

标签: java string hashcode


【解决方案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是字符串的长度,^表示求幂。 (空字符串的哈希值为零。)

很明显,连接两个字符串不会导致一个字符串的哈希码等于组成它的字符串的哈希码的异或。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-24
    • 2011-02-25
    • 1970-01-01
    • 2013-12-19
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多