Le hachage Clés en Java
En java, quand j'utilise une Chaîne de caractères comme une clé pour Hashmap, je suis un peu résultat différent que lorsque j'utilise la chaîne de hashcode de clé dans la table de hachage.
Toute idée?
Pouvez-vous être plus précis? Montrer quelques extraits de code où vous êtes confrontés à ce problème.
Pourquoi attendez-vous d'une clé différente pour produire les mêmes résultats? Il ne sera pas.
Pourquoi attendez-vous d'une clé différente pour produire les mêmes résultats? Il ne sera pas.
OriginalL'auteur user1785771 | 2012-11-03
Vous devez vous connecter pour publier un commentaire.
Vous ne faut pas utiliser le code de hachage de lui-même comme la clé. Des codes de hachage ne sont pas destinés à être unique - il est tout à fait autorisé pour les deux non-valeurs égales à avoir le même code de hachage. Vous devez utiliser la chaîne lui-même comme une clé. La carte est alors de comparer les codes de hachage premier (à affiner le candidat correspond vite) et puis de comparer avec
equals
pour véritable chaîne d'égalité.Bien sûr, c'est en supposant que votre code est vraiment comme votre question le fait, par exemple,
Si c'est vraiment ce que votre code ressemble, il suffit d'utiliser
HashMap<String, String>
à la place.De la documentation pour
de l'Objet.hashCode()
(l'emphase est mienne):OriginalL'auteur Jon Skeet
De cours. Des Cordes différentes peuvent avoir le même hashCode, donc si vous stockez des deux chaînes de caractères comme des clés dans une map, vous disposez de deux entrées (depuis les chaînes de caractères sont différents). Whareas si vous utilisez leur hashCode comme les clés, vous aurez un seul bulletin de participation (depuis leur hashCode est le même).
Le hashCode n'est pas utilisée pour dire si les deux clés sont égaux. C'est seulement utilisée pour affecter un seau à la clé. Une fois le seau est trouvé, chaque clé contenue dans le seau est par rapport à la nouvelle clé avec égal à égal, et la clé est ajoutée à le seau si pas d'égal clé peut être trouvé.
Ne pas sauter à cette conclusion sans mesure. Pourquoi serait-il utiliser plus de mémoire? La carte n'est pas de faire une copie de la clé. Il utilise juste une référence à la clé.
Je sais. Mais quand j'ai plus de deux millions de disques, puis les stocker leurs clés de chaîne est va faire une grande différence! @JB
Ils utilisent plus de mémoire pour une bonne raison: il n'y a plus de imjportant données que juste le 32 bits pour un code de hachage. Si vous avez besoin de stocker beaucoup de chaînes, obtenir beaucoup de mémoire. La mémoire n'est pas cher; les erreurs dues à une mauvaise utilisation d'un hachage de la carte pourrait facilement être très coûteux.
OriginalL'auteur JB Nizet
Le problème est que, même si les deux objets sont différents, ne signifie pas que leurs hashcodes sont également différents.
Deux objets différents peuvent partager le même hashcode. Donc, vous ne devriez pas avoir comme une table de hachage de la clé.
Aussi, parce que les codes de hachage retourné à partir de
Object.hashCode()
méthode sont de typeint
, vous ne pouvez avoir2^32
des valeurs différentes. C'est pourquoi vous aurez des "collisions", selon l'algorithme de hachage, pour les différents objets.En bref: -
!obj.equals(obj1)
ne garantit queobj.hashCode() != obj1.hashCode()
.!obj.equals(obj1)
dans la dernière ligne, comme c'est la partie importante.Ouais c'est vrai. Édité. Merci 🙂
OriginalL'auteur Rohit Jain
HashCodes
peuvent être identiques ou différents pour la même Chaîne, donc soyez prudent avec ça. Peut-être que c'est pourquoi vous obtenez un résultat différent.Voici DONC, la question d'une autre sur elle. Voir Jon Skeet accepté de répondre.
OriginalL'auteur Atif Imran
Vous peut utiliser le code de hachage de la clé que si la fonction de hachage est une parfaite table de hachage (voir par exemple GPERF). Aussi longtemps que vos objets de clé ne réside pas dans la mémoire vous sont correctes que vous allez économiser de la mémoire.
OriginalL'auteur Floris