2012-06-06 7 views
5

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.

+1

inne niż 2, żadna inna liczba parzysta nie jest pierwsza –

+0

omg! Nie mogę uwierzyć, że o tym zapomniałem. Chyba właśnie dzisiaj miałem głupi moment. Dzięki :) – Kes115

+3

Może to być duplikat http://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-tring-use-31-as-a-multiplier. –

Odpowiedz

6

Przy mnożniku parzystości najmniej znaczącym bitem po mnożeniu jest zawsze zero. Przy mnożniku nieparzystym najmniej znaczącym bitem jest albo jeden, albo zero, w zależności od poprzedniej wartości result. Stąd równomierny mnożnik traci niepewność co do małego bitu, a nieparzysty mnożnik to zachowuje.

1

Nie ma czegoś takiego jak duża nawet prime - jedyny nawet Prime 2.

Poza tym - ogólny punkt za pomocą średnich doskonałą zamiast # jeden mały jak 3 lub 5 jest aby zminimalizować prawdopodobieństwo, że dwa obiekty zakończą się tą samą wartością mieszającą, przepełnieniem lub nie.

Ryzyko przepełnienia nie stanowi problemu per se; prawdziwym problemem jest to, jak rozkładane będą wartości hashcode dla zestawu mieszanych obiektów. Ponieważ hashcode są używane w strukturach danych, takich jak HashSet, HashMap itp., Chcesz zminimalizować liczbę obiektów, które mogą potencjalnie udostępniać ten sam kod skrótu, aby zoptymalizować czasy wyszukiwania w tych kolekcjach.

Powiązane problemy