ist HashSet aufgrund von Hash-Kollisionen sicher [doppelt]
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());
Ausgabe:
2236
2236
2236
Meine Frage ist, ob es immer mit Hash-Kollisionen umgeht und woher genau weiß es, dass das Objekt anders ist, wenn der Hash genau gleich ist? Prüfen sie, ob sie gleich sind, und wenn ja, besiegt dies nicht den Punkt des Haschens.
Im Vergleich zu sha256, das praktisch keine Hash-Kollisionen für ein Programm hat, das ich mache, wenn ich Hashset für Strings verwende, würde es vermasseln und wie wahrscheinlich würde String.hashCode () miteinander kollidieren? Zum Beispiel, warum sie Hash verwenden, wenn sowohl die Include- als auch die Add-Methode den Hash nicht zu überprüfen scheinen?
Antworten
Gleicher Hash-Code bedeutet nicht, dass Objekte gleich sind. Wenn zwei Objekte gleich sind, sollten sie laut Sammlungsvertrag denselben Hash-Code haben, nicht umgekehrt.
Es spielt keine Rolle, dass Objekte in einer Sammlung wie set und map Hash-Kollisionen aufweisen. Sie funktionieren ordnungsgemäß, bis die Methode equals Objekte unterscheiden kann. Obwohl sich die Leistung möglicherweise verschlechtert, da sich das Set effektiv auf die Liste verschlechtert, wenn alle Hashes gleich sind.