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

Java字符串上的哈希码溢出的后果

凤棋
2023-03-14
问题内容

我最近在这里阅读了一些有关Java
String类的哈希码的信息,但我一直找不到这样的信息:当字符串的长度大于32时会发生什么(我知道会发生溢出,但是将其作为哈希键) ,
怎么了)?例如,我需要对长度在20到120个字符之间的字符串进行哈希处理,才能将它们用作哈希键。我需要使用BigInteger实现自己的算法吗?

另外,由于我可能有30k到80k之间的字符串,也许更多,通常的String哈希码是否足够避免冲突?


问题答案:

(我知道会发生溢出,但是作为哈希键,会发生什么)?

在Java中,原始类型的算术上溢和下溢不会引发运行时错误或异常。结果的溢出部分只会丢失。

如果程序员不知道此属性,则可能导致逻辑错误或其他困难,但这是JVM的指定行为。

int在计算哈希码时,您不必担心类型的上溢或下溢。溢出的位只会丢失。

这不会影响所计算的哈希值的正确性或其良好分布到哈希存储桶的能力。

另外,由于我可能有30k到80k之间的字符串,也许更多,通常的String哈希码是否足够避免冲突?

需要牢记的几件事:

  • Java字符串是不可变的。因此,String实例的哈希值仅计算一次。之后,将结果缓存在实例中,以便后续的调用hashCode()不会导致重复计算。这是可行的,因为字符串是不可变的,并且每次重新计算值都相同。

  • 实际上,应该从实例中的所有有意义的信息中计算出哈希码。这意味着,如果您的String包含20k信息,则应从所有20k信息中计算出哈希码(但请参见上文)。当然,这会影响性能,因此您应该相应地设计程序。

  • 冲突的“自由”性与实现的质量有很大关系,hashCode()而与Strings的大小则无关。用于生成哈希码的算法应能够产生良好的分布。“好哈希函数”的确切含义尚不清楚,但这是数学理论家的主题。幸运的是,即使“哈希函数”可能不是“最新技术”,定义一个“足够好”的哈希函数也不难(见有效Java,第二版; J。Bloch)。



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

  • 问题内容: 有什么方法可以在Java中使用字符串的哈希码,然后重新创建该字符串? 例如这样的事情: 我之所以这样说,是因为我必须将字符串转换为整数值,然后从该整数值重构该字符串。 问题答案: 这是不可能的。String的哈希码是有损的;许多字符串值将导致相同的哈希码。一个整数有32个位,每个位置有两个值。即使是32个字符的字符串(例如,每个字符都有很多可能性)也无法映射为32位而不会发生冲突。他们

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

  • 问题内容: 我想知道如何手动计算给定字符串的哈希码。我了解在Java中,您可以执行以下操作: 一切都很好,但我想知道如何手工完成。我知道给定的公式来计算字符串的哈希码是这样的: 其中,S表示字符串中的字符,n是字符串的长度。然后使用16位unicode,来自字符串me的第一个字符将计算为: 然而,这产生了惊人的数量。我无法想象像这样将所有字符加在一起。那么,为了计算最低阶的32位结果,我该怎么办?

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

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