hashCode()
Metoda klasy Boolean jest realizowany w ten sposób:
public int hashCode() {
return value ? 1231 : 1237;
}
Dlaczego używa 1231 i 1237? Dlaczego nie coś innego?
hashCode()
Metoda klasy Boolean jest realizowany w ten sposób:
public int hashCode() {
return value ? 1231 : 1237;
}
Dlaczego używa 1231 i 1237? Dlaczego nie coś innego?
Odpowiedzi:
1231 i 1237 to tylko dwie (wystarczająco duże) dowolne liczby pierwsze . Jakiekolwiek inne dwie duże liczby pierwsze byłyby w porządku.
Dlaczego liczby pierwsze?
Załóżmy na sekundę, że wybraliśmy liczby złożone (inne niż liczby pierwsze), powiedzmy 1000 i 2000. Podczas wstawiania wartości logicznych do tablicy haszującej, prawda i fałsz trafiałyby do zasobnika 1000 % N
wzgl 2000 % N
(gdzie N
jest liczba segmentów).
Teraz zauważ to
1000 % 8
to samo wiadro co 2000 % 8
1000 % 10
to samo wiadro co 2000 % 10
1000 % 20
to samo wiadro co 2000 % 20
innymi słowy, doprowadziłoby to do wielu kolizji .
Dzieje się tak, ponieważ faktoryzacja 1000 (2 3 , 5 3 ) i faktoryzacja 2000 (2 4 , 5 3 ) mają tak wiele wspólnych czynników. W ten sposób wybiera się liczby pierwsze, ponieważ jest mało prawdopodobne, aby miały jakieś wspólne czynniki związane z rozmiarem łyżki.
Dlaczego duże liczby pierwsze. Czy 2 i 3 nie zrobiłyby?
Podczas obliczania kodów skrótów dla obiektów złożonych często dodaje się kody skrótów dla komponentów. Jeśli w zestawie skrótów z dużą liczbą segmentów zostaną użyte zbyt małe wartości, istnieje ryzyko, że skończy się to nierównomiernym rozmieszczeniem obiektów.
Czy kolizje mają znaczenie? Booleany mają po prostu dwie różne wartości?
Mapy mogą zawierać wartości logiczne razem z innymi obiektami. Ponadto, jak zauważył Drunix, powszechnym sposobem tworzenia funkcji skrótu obiektów złożonych jest ponowne użycie implementacji kodu skrótu składowego, w którym to przypadku dobrze jest zwrócić duże liczby pierwsze.
Powiązane pytania:
2*1231 = 2462
zasobników. Czy w takiej sytuacji kolizje są problemem?