这个hashCode方法会溢出吗?
Will this hashCode method overflow?
我正在编写一个 Android 应用程序,它有一个成就系统,类似于 Stack Overflow 的徽章。我还使用 Sugar ORM 将成就的进度存储在数据库中。这是成就` class:
public class Achievement extends SugarRecord<Achievement>{
@StringRes
public int shortNameId;
@StringRes
public int descriptionId;
public int progressNow;
public int fullProgress;
//I am afraid that Sugar ORM will ignore private fields
//so I made them public. Please tell me if Sugar ORM does
//not ignore those.
}
现在我想覆盖 class 中的 hashCode
方法。根据有效Java第2版,我是这样实现的:
@Override
public int hashCode () {
int result = 17;
result = result * 31 + shortNameId;
result = result * 31 + descriptionId;
result = result * 31 + fullProgress;
return result;
}
然后我查看了生成的 R.java
以查看字符串 res id 是什么(我只是好奇)。我意识到它们是相当大的数字。在 hashCode
方法中,我将 result
乘以 31,3 次,这已经有点大了。现在,我向其中添加了非常大的资源 ID。恐怕结果值会超过 Integer.MAX_VALUE
.
你能告诉我我的 hashCode
方法是否会溢出吗?如果是,我该如何解决?
没关系。整数溢出不会产生异常或其他错误,它只是从 MIN_VALUE
绕回。 hashCode()
唯一有用的特征(除了相等要求之外)是它以某种方式分散到不同的值。负散列码很好。 (事实上,Integer#hashCode()
只是 int
值。)
我正在编写一个 Android 应用程序,它有一个成就系统,类似于 Stack Overflow 的徽章。我还使用 Sugar ORM 将成就的进度存储在数据库中。这是成就` class:
public class Achievement extends SugarRecord<Achievement>{
@StringRes
public int shortNameId;
@StringRes
public int descriptionId;
public int progressNow;
public int fullProgress;
//I am afraid that Sugar ORM will ignore private fields
//so I made them public. Please tell me if Sugar ORM does
//not ignore those.
}
现在我想覆盖 class 中的 hashCode
方法。根据有效Java第2版,我是这样实现的:
@Override
public int hashCode () {
int result = 17;
result = result * 31 + shortNameId;
result = result * 31 + descriptionId;
result = result * 31 + fullProgress;
return result;
}
然后我查看了生成的 R.java
以查看字符串 res id 是什么(我只是好奇)。我意识到它们是相当大的数字。在 hashCode
方法中,我将 result
乘以 31,3 次,这已经有点大了。现在,我向其中添加了非常大的资源 ID。恐怕结果值会超过 Integer.MAX_VALUE
.
你能告诉我我的 hashCode
方法是否会溢出吗?如果是,我该如何解决?
没关系。整数溢出不会产生异常或其他错误,它只是从 MIN_VALUE
绕回。 hashCode()
唯一有用的特征(除了相等要求之外)是它以某种方式分散到不同的值。负散列码很好。 (事实上,Integer#hashCode()
只是 int
值。)