Java中用于文本字符串的64位哈希函数是什么?

我正在寻找一个散列函数:

  1. 很好地哈希 (例如,很少冲突)
  2. 用Java编写,并被广泛使用
  3. 奖励:适用于多个字段(而不是我将它们串联并在连接的字符串上应用哈希)
  4. 奖励:具有128位变量。
  5. 奖励:不占用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

回到顶部