Java中用于文本字符串的64位哈希函数是什么?
我正在寻找一个散列函数:
- 很好地哈希 (例如,很少冲突)
- 用Java编写,并被广泛使用
- 奖励:适用于多个字段(而不是我将它们串联并在连接的字符串上应用哈希)
- 奖励:具有128位变量。
- 奖励:不占用CPU。
回答:
您为什么不使用long
默认值的变体String.hashCode()
(一些真正聪明的人肯定会努力使它变得高效-
更不用说已经看过此代码的数千名开发人员的眼睛了)?
// 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;
}
如果您要查找更多位,则可以使用“ 编辑”:BigInteger
正如我在对@brianegge的答案的评论中提到的那样,对于32位以上的哈希没有太多用例,对于64位以上的哈希,很可能没有一个用例:
我可以想象一个分布在数十个服务器上的巨大哈希表,也许存储了数百亿个映射。对于这种情况,@brianegge在这里仍然有一个有效的点:32位允许2 ^
32(约43亿)个不同的哈希键。假设算法很强大,您仍然应该有很少的冲突。使用64位(184,744,470.073十亿种不同的密钥),无论您需要哪种疯狂的方案,都可以节省。但是,对于128位密钥(340,282,366,920,938,463,463,374,607,607,431,030亿个可能的密钥)的用例的思考几乎是不可能的。
要组合多个字段的哈希,只需 将X 与一个素数相乘,然后将它们相加即可:
long hash = MyHash.hash(string1) * 31 + MyHash.hash(string2);
小质数在那里避免切换值具有相等的哈希码,即{‘foo’,’bar’}和{‘bar’,’foo’}不相等,应具有不同的哈希码。XOR不好,因为如果两个值相等,它将返回0。因此,{‘foo’,’foo’}和{‘bar’,’bar’}将具有相同的哈希码。
以上是 Java中用于文本字符串的64位哈希函数是什么? 的全部内容, 来源链接: utcz.com/qa/419985.html