czy HashSet jest bezpieczny z powodu kolizji z hashami [duplikat]
Set<String> set = new HashSet<>();
set.add("FB");
set.add("Ea");
set.add("G#");
set.add("FB");
for(String s : set)
System.out.println(s.hashCode());
wynik:
2236
2236
2236
Moje pytanie brzmi: czy zawsze radzi sobie z kolizjami hash i skąd dokładnie wie, że obiekt jest inny, jeśli hash jest dokładnie taki sam? Czy sprawdzają równa się, a jeśli tak, to nie pokonuje punktu haszowania.
W porównaniu do sha256, który praktycznie nie ma kolizji skrótów dla programu, który tworzę, czy jeśli użyję hashset dla ciągów, to zepsuje i jak prawdopodobne jest zderzenie String.hashCode () ze sobą? Na przykład, dlaczego używają skrótu, jeśli zarówno metoda zawiera, jak i add nie wydaje się sprawdzać skrótu?
Odpowiedzi
Jednakowy kod skrótu nie oznacza, że obiekty są równe. Zgodnie z umową kolekcji, jeśli dwa obiekty są równe, powinny mieć ten sam kod skrótu, a nie odwrotnie.
Naprawdę nie ma znaczenia, że obiekty w kolekcji, takie jak set i map, mają kolizje hash, będą działać poprawnie, dopóki metoda equals nie będzie w stanie rozróżnić obiektów. Chociaż wydajność może spaść, ponieważ set skutecznie obniży się do listy, jeśli wszystkie skróty są takie same.