gpt4 book ai didi

language-agnostic - 普通程序员有 "good enough"哈希函数吗?

转载 作者:行者123 更新时间:2023-12-04 17:28:50 24 4
gpt4 key购买 nike

我们被告知我们应该为我们的类实现 hashCode() 但是像我这样的大多数人都不知道如何做到这一点,或者如果我们把它弄错了会发生什么。例如,我需要一个哈希函数来索引树中的节点( Finding the most frequent subtrees in a collection of (parse) trees )。在这种情况下,我需要根据有序的子节点递归生成哈希码,例如

hashCode = function(child1.hashCode, child2.hashCode, ...)

recent discussion的 hashCodes 答案包括字符串的哈希值(基于长质数和 31)以及位移位。字符串哈希是:
// 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;
}

我对安全不感兴趣,也不介意碰撞。是否有一个“通用函数”来组合有序对象的哈希码,它的好处多于坏处(而且比根本不调用它更好)?

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

我没有指定一种语言,因为我希望有通用的方法。但是,如果它是严重的特定语言,那么请说明语言以及为什么它不是通用的。

更新 两个建议是使用 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;
}

最佳答案

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

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

关于language-agnostic - 普通程序员有 "good enough"哈希函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1689883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com