Вот пример кода из статьи 9:
public final class PhoneNumber {
private final short areaCode;
private final short prefix;
private final short lineNumber;
@Override
public int hashCode() {
int result = 17;
result = 31 * result + areaCode;
result = 31 * result + prefix;
result = 31 * result + lineNumber;
return result;
}
}
На стр. 48 указано: "значение 31 было выбрано, потому что это нечетное простое число. Если если бы оно было четным и умножение переполнилось, информация была бы потеряна, так как умножение на 2 эквивалентно сдвигу».
Я понимаю, что концепция умножения на 2 эквивалентна сдвигу битов. Я также знаю, что мы все равно получим переполнение (следовательно, потеря информации), когда мы умножаем большое число на большое нечетное простое число. Чего я не понимаю, так это того, почему потеря информации, возникающая в результате умножения на большие нечетные простые числа, предпочтительнее потери информации, возникающей в результате умножения на большие четные числа.