czy HashSet jest bezpieczny z powodu kolizji z hashami [duplikat]

Nov 24 2020
    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

tentacle Nov 24 2020 at 15:59

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.