关于整数乘法、溢出和信息丢失
2022-09-03 05:59:40
我正在阅读Joshua Bloch的《Effective Java》的第3章。在项目 8:当您覆盖等于时始终覆盖哈希码中,作者在其哈希函数中使用以下组合步骤:
result = 37 * result + c;
然后,他解释了为什么选择37(着重号是后加的):
选择乘数37是因为它是一个奇数素数。如果它是偶数并且乘法溢出,信息将丢失,因为乘以二相当于移位。使用素数的优点不太清楚,但传统上使用素数来实现此目的。
我的问题是,为什么组合因子(37)是奇数很重要?乘法溢出不会导致信息丢失,而不管因子是奇数还是偶数?