est HashSet sûr en raison de collisions de hachage [duplicate]
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());
production:
2236
2236
2236
Ma question est: gère-t-il toujours les collisions de hachage et comment sait-il exactement que l'objet est différent si le hachage est exactement le même? Vérifient-ils égaux et si oui, cela ne va pas à l'encontre du point de hachage.
Comparé à sha256 qui n'a pratiquement pas de collsions de hachage pour un programme que je suis en train de créer, si j'utilisais un hashset pour les chaînes, serait-il gâché et quelle serait la probabilité que String.hashCode () se heurte? Par exemple, pourquoi utilisent-ils le hachage si les méthodes contains et add ne semblent pas vérifier le hachage?
Réponses
Un code de hachage égal ne signifie pas que les objets sont égaux. Selon le contrat de collection, si deux objets sont égaux, ils doivent avoir le même code de hachage, et non l'inverse.
Peu importe que les objets d'une collection comme set et map aient des collisions de hachage, ils fonctionneront correctement jusqu'à ce que la méthode equals puisse distinguer les objets. Bien que les performances puissent se dégrader, car set se dégradera effectivement en liste si tous les hachages sont identiques.