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

我最近在这里阅读了一些有关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)。

以上是 Java字符串上的哈希码溢出的后果 的全部内容, 来源链接: utcz.com/qa/420725.html

回到顶部