这个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 值。)