Oto przykładowy kod z pozycji 9:Potrzeba wyjaśnienia na przykład hashcode w podręczniku Efektywna Java
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;
}
}
Pg 48 stwierdza: „wartość 31 została wybrana, ponieważ jest to dziwne prime Gdyby to było. nawet i mnożenie się przepełniło, informacje zostałyby utracone, ponieważ pomylenie przez 2 jest równoznaczne z przesunięciem. "
Rozumiem pojęcie mnożenia przez 2, które jest równoważne przesunięciu bitów. Wiem też, że nadal będziemy mieli przepełnienie (stąd utrata informacji), gdy pomnożymy dużą liczbę przez dużą nieparzystą liczbę pierwszą. Czego nie rozumiem, to dlaczego utrata informacji wynikająca z mnożenia przez duże nieparzyste liczby pierwsze jest lepsza od utraty informacji wynikającej z mnożenia przez duże liczby parzyste.
inne niż 2, żadna inna liczba parzysta nie jest pierwsza –
omg! Nie mogę uwierzyć, że o tym zapomniałem. Chyba właśnie dzisiaj miałem głupi moment. Dzięki :) – Kes115
Może to być duplikat http://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-tring-use-31-as-a-multiplier. –