当前位置: 首页 > 面试题库 >

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

郎玮
2023-03-14
问题内容

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

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

问题答案:

您为什么不使用long默认值的变体String.hashCode()(一些真正聪明的人肯定会努力使它变得高效-
更不用说已经看过此代码的数千名开发人员的眼睛了)?

// adapted from String.hashCode()
html" target="_blank">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’}将具有相同的哈希码。



 类似资料:
  • 问题内容: 我需要将字符串转换为某种形式的哈希。这在JavaScript中可行吗? 我没有使用服务器端语言,所以我不能那样做。 问题答案: Object.defineProperty(String.prototype, ‘hashCode’, { value: function() { var hash = 0, i, chr; for (i = 0; i < this.length; i++)

  • 问题内容: 我有一个要哈希的字符串。在node.js中生成哈希的最简单方法是什么? 哈希用于版本控制,而非安全性。 问题答案: 看看crypto.createHash(algorithm)

  • 问题内容: 您如何将任意字符串转换为唯一的整数,这在Python会话和平台之间是相同的?例如,由于每个Python会话和平台均返回不同的值,因此无法使用。 问题答案: 如果哈希函数确实不适合您,则可以将字符串转换为数字。 通过将每个三元组映射到,这是可逆的。

  • 我对将纯java Curve25519函数转换为Python等效函数存在问题,具体问题与将哈希字符串转换为字节等效函数的摘要函数有关,java实现: 数据示例: sP=“这是一个用于测试目的的密码短语示例” 生成此字节输出: 82, -57, 124, 58, -105, 76, 123, 3, 119, -21, 121, 71, -54, 73, -75, 54, 31, -33, -49,

  • 问题内容: 如果我将函数名称存储为字符串在Hashtable中。 有没有办法通过存储的字符串访问函数? 编辑恐怕我在CLDC1.1 / MIDP2.0上工作的平台不支持反射。 有什么解决方法? 问题答案: 只需使用一长串else-ifs: (尽管我通常不喜欢尝试在源代码中进行垂直对齐,但我认为在这种情况下这样做是值得的。) 在映射中存储函子是一种替代方法,对于许多MIDP应用程序,bu可能会增加对

  • 说到什么是字符串哈希(Hash)?很多人都会疑惑,我们可以这么理解,定义一个把字符串映射到整数的函数 f,这个 f 称为是Hash函数。而我们希望这个函数 f 可以方便地帮我们判断两个字符串是否相等。 (1)Hash 的思想 Hash 的核心思想在于,将输入映射到一个值域较小、可以方便比较的范围。 (2)使用场景 当一个字符串规模很大,并且需要多次访问该字符串或者子串的时候,我们可以用哈希函数对每