【问题标题】:hashCode() for string returning negative value [duplicate]hashCode() 用于返回负值的字符串 [重复]
【发布时间】:2015-01-14 16:16:57
【问题描述】:

"random".hashCode() 返回值 -938285885。 hashCode() 是否应为负值?

根据下面的问题,有一种方法可以计算字符串的hashCode(),但是使用它,值不会随着字符串长度的增加而不断增加并最终大于Integer.MAX_VALUE吗?

【问题讨论】:

  • 为什么你认为它不应该/不能返回负值?解释你的期望。
  • 任何 int 都不能大于 Integer.MAX_VALUE。这就是“最大值”的意思。当 int 计算的数值结果大于 Integer.MAX_VALUE 时,会发生算术溢出。 (去谷歌上查询)。有时溢出是一件坏事,但在计算哈希码时,它只是计算的正常部分。
  • "random".hashCode()(((('r'*31+'a')*31+'n')*31+'d')*31+'o')*31+'m' 相同。 "rando"hashCode 为正数,但第五次乘以 31 会导致溢出,因此结果为负数。

标签: java hashcode


【解决方案1】:

hashCode() 是否需要负值?

它们是完全有效的,是的。

值不会随着字符串长度的增加而不断增加,最终大于 Integer.MAX_VALUE 吗?

是什么让您认为哈希码会随着字符串长度的增加而增加?

基本上,您应该将哈希码视为指纹 - 比特的集合,而不是具有有意义量级的数字。哈希码计算经常上溢或下溢,这绝对没问题。 “更多”或“更少”是哈希码之间不相关的比较 - 所有相关的是“相等”或“不相等”,其中规则是两个相等值的哈希码必须相等,但两个不相等值的哈希码可能仍然相等。数值在分桶方面是相关的,但这通常是使用它们的任何实现细节。

哈希码只是一种快速查找绝对不相等的值的方法。所以考虑这样一种情况,我有一组带有哈希码 { 1, -15, 20, 5, 100 } 的字符串。如果给定一个哈希码为 14 的字符串,我知道字符串 肯定 不在集合中。如果给定一个哈希码为 20 的字符串,我需要使用 equals 对照我的集合中哈希码为 20 的字符串检查它,以查看候选字符串是否在集合中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    相关资源
    最近更新 更多