web-dev-qa-db-fra.com

Qu'est-ce que la collision de hachage?

Collision de hachage ou collision de hachage dans HashMap n'est pas un sujet nouveau et j'ai rencontré plusieurs blogs et forums de discussion expliquant comment produire Hash Collision ou comment l'éviter de manière ambiguë et détaillée. Je suis récemment tombé sur cette question dans une interview. J'avais beaucoup de choses à expliquer mais je pense qu'il était vraiment difficile de donner la bonne explication. Désolé si mes questions sont répétées ici, veuillez me diriger vers la réponse précise:

  1. Qu'est-ce que c'est exactement une collision entre hachures - s'agit-il d'une caractéristique ou d'un phénomène courant qui est commis par erreur mais qu'il est bon d'éviter?
  2. Qu'est-ce qui provoque exactement Hash Collision - la mauvaise définition de la méthode hashCode() de la classe personnalisée, OR, laisse la méthode equals() non substituée tout en surchargeant imparfaitement la méthode hashCode() seule, OR ne dépend-il pas des développeurs et de nombreuses bibliothèques Java populaires ont également des classes qui peuvent causer une collision de hachage?
  3. Quelque chose ne va pas ou inattendu quand une collision de hachage se produit? Je veux dire y at-il une raison pour laquelle nous devrions éviter la collision de hachage?
  4. Est-ce que Java génère ou au moins tente de générer un hashCode unique par classe lors de l'initiation de l'objet? Si non, est-il juste de se fier uniquement à Java pour s'assurer que mon programme ne s'exécutera pas dans les classes Hash Collision for JRE? Si ce n’est pas le cas, comment éviter la collision de hash pour hashmaps avec des classes finales telles que String as key?

Je vous serais reconnaissant de bien vouloir partager vos réponses à l'une ou à toutes ces questions.

13
sribasu

Qu'est-ce que c'est exactement une collision entre hachures - s'agit-il d'une caractéristique ou d'un phénomène courant qui est commis par erreur mais qu'il est bon d'éviter?

C'est une fonctionnalité. Il découle de la nature d'un hashCode: un mappage d'un grand espace de valeurs sur un espace de valeurs beaucoup plus petit. Il y aura des collisions, par conception et par intention. 

Qu'est-ce qui provoque exactement Hash Collision - la mauvaise définition de la méthode hashCode () de la classe personnalisée,

Une mauvaise conception peut aggraver la situation, mais elle est endémique dans la notion.

OU de laisser la méthode equals () non remplacée en substituant imparfaitement la méthode hashCode () seule,

Non.

OU n'est-ce pas le cas des développeurs et de nombreuses bibliothèques Java populaires ont également des classes pouvant causer une collision de hachage?

Cela n'a pas vraiment de sens. Les hachages sont voués à entrer en collision tôt ou tard, et de mauvais algorithmes peuvent le rendre plus tôt. C'est à peu près ça.

Quelque chose ne va pas ou inattendu quand une collision de hachage se produit?

Pas si la table de hachage est écrite avec compétence. Une collision de hachage signifie seulement que le hashCode n'est pas unique, ce qui vous oblige à appeler equals(), et plus il y a de doublons, plus la performance est mauvaise.

Je veux dire y at-il une raison pour laquelle nous devrions éviter la collision de hachage?

Vous devez faire un compromis entre facilité de calcul et propagation des valeurs. Il n'y a pas de réponse unique en noir et blanc.

Est-ce que Java génère ou au moins essaie de générer un hasCode unique par classe lors de l'initiation de l'objet?

Non. Le «code de hachage unique» est une contradiction dans les termes.

Si non, est-il juste de se fier uniquement à Java pour s'assurer que mon programme ne s'exécutera pas dans les classes Hash Collision for JRE? Si ce n’est pas le cas, comment éviter la collision de hash pour hashmaps avec des classes finales telles que String as key?

La question n'a pas de sens. Si vous utilisez String, vous n'avez pas le choix quant à l'algorithme de hachage et vous utilisez également une classe dont le hashCode a été asservi par des experts depuis au moins vingt ans. 

8
user207421

En fait, je pense que la collision de hachage est normale. Laissons parler d'un cas pour réfléchir. Nous avons 1000000 grands nombres (l'ensemble S de x), disons que x est dans 2 ^ 64. Et maintenant, nous voulons faire une carte pour cet ensemble de nombres. Permet de mapper ce nombre mis S à [0,1000000]. 

Mais comment? utilisez le hash !! 

Définissez une fonction de hachage f(x) = x mod 1000000. Et maintenant, le x dans S sera converti en [0,1000000), OK, mais vous constaterez que de nombreux nombres dans S seront convertis en un seul nombre. par exemple. le nombre k * 1000000 + y sera tous situé dans y qui parce que (k * 1000000 + y)% x = y. C'est donc une collision de hachage. 

Et comment faire face à la collision? Dans ce cas, nous avons parlé ci-dessus, il est très difficile de délimiter la collision parce que l'informatique mathématique a une certaine posibillité. Nous pouvons trouver une fonction de hachage plus complexe, plus efficace, mais nous ne pouvons pas affirmer que nous éliminons la collision. Nous devrions faire notre possible pour trouver une fonction de hachage plus efficace afin de réduire la collision de hachage. Parce que la collision de hachage augmente le coût en temps, nous utilisons du hachage pour trouver quelque chose. 

Simplement, il y a deux façons de gérer les collisions de hachage. la liste liée est un moyen plus direct, par exemple: si deux nombres ci-dessus obtiennent la même valeur après hash_function, nous créons une liste liée à partir de ce compartiment de valeurs et la même valeur est placée dans la liste liée de la valeur. Et une autre solution consiste à trouver simplement une nouvelle position pour le dernier numéro. Par exemple, si le numéro 1000005 a pris la position dans 5 et que 2000005 obtient la valeur 5, il ne peut pas être situé à la position 5, alors il va de l'avant et trouve une position vide à prendre. 

Pour la dernière question: Est-ce que Java génère ou essaie au moins de générer un hashCode unique par classe lors de l'initiation de l'objet?

le hashcode de Object est généralement mis en œuvre en convertissant l'adresse interne de l'objet en un entier. Ainsi, vous pouvez penser que différents objets ont un hashcode différent, si vous utilisez le hashcode () de l'objet.

3
GuangshengZuo

Qu'est-ce qu'une collision de hachage? - s'agit-il d'une caractéristique ou d'un phénomène courant qui est fait à tort mais bon à éviter?

Ni l'un ni l'autre… les deux… c'est un phénomène commun, mais ce n'est pas une erreur, c'est bon à éviter.

Qu'est-ce qui cause exactement la collision de hachage - la mauvaise définition de custom Méthode hashCode () de la classe, OR pour quitter la méthode equals () non substitué tout en surchargeant imparfaitement la méthode hashCode () seul, OR n’est-ce pas la responsabilité des développeurs et de nombreux Java populaires bibliothèques a également des classes qui peuvent causer une collision de hachage?

en concevant mal votre méthode hashCode (), vous pouvez générer trop de collisions. Ne pas remplacer la méthode égale ne devrait pas affecter directement le nombre de collisions. De nombreuses bibliothèques Java populaires ont des classes qui peuvent provoquer des collisions (presque toutes les classes en fait).

Quelque chose ne va pas ou inattendu quand une collision de hachage se produit? JE signifie-t-il une raison pour laquelle nous devrions éviter la collision de hachage?

Il y a une dégradation des performances, c'est une raison pour les éviter, mais le programme devrait continuer à fonctionner.

Est-ce que Java génère ou au moins tente de générer un hashCode par .__ unique? classe lors de l'initiation d'objet? Si non, est-il juste de s’appuyer sur Java seul pour m'assurer que mon programme ne se heurterait pas à Hash Collision pour Cours de JRE? Si ce n’est pas juste, alors comment éviter une collision de hash pour hashmaps avec les classes finales comme String as key?

Java n'essaie pas de générer un code de hachage unique lors de l'initialisation de l'objet, mais il a une implémentation par défaut de hashCode () et equals (). L'implémentation par défaut permet de savoir si deux références d'objet pointent sur la même instance ou non, et ne repose pas sur le contenu (valeurs de champ) des objets. Par conséquent, la classe String a sa propre implémentation.

1
Maurice Perry

Qu'est-ce que c'est exactement une collision de hachage - s'agit-il d'une caractéristique ou d'un phénomène commun qui est commis par erreur mais qu'il est bon d'éviter?

  • une collision de hachage est exactement cela, une collision de ce champ hashcode sur des objets ...

Quelles sont les causes exactes de Hash Collision - la mauvaise définition de la méthode hashCode () de la classe personnalisée, OR, laisse la méthode equals () non substitué tout en surchargeant imparfaitement la méthode hashCode () seul, OR n’est-ce pas la responsabilité des développeurs et de nombreux Java populaires bibliothèques a également des classes qui peuvent causer une collision de hachage?

  • non, une collision peut survenir car ils sont régis par une probabilité mathématique et dans de tels cas, le paradoxe de l'anniversaire est le meilleur moyen de l'expliquer.

Quelque chose ne va pas ou inattendu quand une collision de hachage se produit? Je veux dire y at-il une raison pour laquelle nous devrions éviter la collision de hachage?

  • non, la classe String en Java est une classe très bien développée, et vous n'avez pas besoin de chercher trop pour trouver une collision (vérifiez le hascode de cette chaîne "Aa" et "BB" -> les deux ont une collision vers 2112) 

pour résumer: La collision de hashcode est inoffensive si vous savez à quoi sert-il et pourquoi n’est pas identique à un identifiant utilisé pour prouver l’égalité