普通程序员是否有"足够好"的哈希函数?

pet*_*ust 5 language-agnostic hash

我们被告知我们应该为我们的类实现hashCode(),但是像我这样的大多数人都不知道如何做到这一点,或者如果我们把它"弄错"会发生什么.例如,我需要一个哈希函数来索引树中的节点(在(解析)树的集合中查找最频繁的子树).在这种情况下,我需要基于有序的子节点递归地生成哈希码,例如

hashCode = function(child1.hashCode, child2.hashCode, ...)
Run Code Online (Sandbox Code Playgroud)

最近的hashCodes 讨论中,答案包括字符串的散列(基于长素数和31)以及位移.String哈希是:

// adapted from String.hashCode()
public static long hash(String string) {
  long h = 1125899906842597L; // prime
  int len = string.length();

  for (int i = 0; i < len; i++) {
    h = 31*h + string.charAt(i);
  }
  return h;
}
Run Code Online (Sandbox Code Playgroud)

我对安全性不感兴趣,也不介意碰撞.是否存在一个"通用函数",用于组合有序对象的哈希码,它们会比损害更好(并且比完全不调用它更好)?

还有一个我们可以查找常见案例的网站吗?字符串,列表等)

我没有指定语言,因为我希望有通用的方法.但如果它是严格的语言,那么请说明语言以及为什么它不是普遍的.

更新两个建议是使用IDE的hashCode生成器.这似乎是一个很好的默认; 这是Netbeans:

public int hashCode() {
    int hash = 5;
// objects
    hash = 97 * hash + (this.rootElement != null ? this.rootElement.hashCode() : 0);
    hash = 97 * hash + (this.tableElement != null ? this.tableElement.hashCode() : 0);
// a string
    hash = 97 * hash + (this.tag != null ? this.tag.hashCode() : 0);
    return hash;
}
Run Code Online (Sandbox Code Playgroud)

dus*_*ine 4

Joshua Bloch 的《Effective Java》中有一个很棒的 hashCode() 。示例第 3 章“所有对象通用的方法”免费的(好吧,当 Sun 的旧站点上有一个页面时,它就回来了。如果您搜索,您可能仍然会在某个地方找到该章的 PDF 版本) 。

您还可以查看Apache Commons Lang 中HashCodeBuilder的源代码,但不要在不引用它的情况下将其复制到类中。花时间去真正了解这一点是值得的——它会让你成为一个更好的人。