Obecnie pracuję nad biblioteką kolekcji dla mojego niestandardowego języka programowania. Mam już kilka typów danych (Kolekcja, Lista, Mapa, Zestaw) i implementacje dla nich (zmienne i niezmienne), ale dotychczas brakowało mi hashCode
i equals
. Chociaż nie są one problemem dla list, ponieważ są one uporządkowanymi kolekcjami, odgrywają szczególną rolę dla zestawów i map. Dwa zestawy są uważane za równe, jeśli mają ten sam rozmiar i te same elementy, a kolejność, w jakiej zestawy je zachowują, nie powinna mieć wpływu na ich równość. Z powodu równości-hashCode-kontrakt implementacja hashCode
musi również odzwierciedlać to zachowanie, co oznacza, że dwa zestawy z tymi samymi elementami, ale z inną kolejnością, powinny mieć ten sam kod skrótu. (To samo dotyczy Maps, które są technicznie Zestaw klucz-wartość-parach)Niezależny od zamówienia algorytm skrótu
przykładu (Pseudokod):
let set1: Set<String> = [ "a", "b", "c" ]
let set2: Set<String> = [ "b", "c", "a" ]
set1 == set2 // should return true
set1.hashCode == set2.hashCode // should also return true
Jak zaimplementować całkiem dobry algorytm mieszania dla których hashCode
s w powyższym przykładzie zwraca tę samą wartość?
Jak o parze (suma, produktu) warunków w zestawie? Oba razem nie byłyby wspólne dla różnych zestawów liczb (o ile widziałem). –
Na przykład coś podobnego do '(e1.hashCode() + e2.hashCode() + ... + en.hashCode())^(e1.hashCode() * e2.hashCode() * ... * en.hashCode()) '? – Clashsoft
Czy próbowałeś sprawdzić, w jaki sposób Java to implementuje? – RealSkeptic