web-dev-qa-db-fra.com

A quoi sert hashCode? Est-ce unique?

Je remarque qu’il existe une méthode getHashCode() dans chaque contrôle, élément, dans WP7, qui renvoie une séquence de nombres. Puis-je utiliser ce hashcode pour identifier un article? Par exemple, je veux identifier une image ou une chanson dans l'appareil, et vérifier où elle se trouve. Cela peut être fait si le hashcode donné pour des éléments spécifiques est unique.

Pouvez-vous m'aider à m'expliquer en quoi hashCode et getHashCode() sont-ils utilisés?

113
Nghia Nguyen

MSDN dit :

Un code de hachage est une valeur numérique utilisée pour identifier un objet lors du test d'égalité. Il peut également servir d'index pour un objet dans une collection.

La méthode GetHashCode est appropriée pour une utilisation dans des algorithmes de hachage et des structures de données telles qu'une table de hachage.

L'implémentation par défaut de la méthode GetHashCode ne garantit pas des valeurs de retour uniques pour différents objets. En outre, le .NET Framework ne garantit pas l'implémentation par défaut de la méthode GetHashCode et la valeur renvoyée sera la même entre les différentes versions du .NET Framework. Par conséquent, l'implémentation par défaut de cette méthode ne doit pas être utilisée comme identifiant d'objet unique à des fins de hachage.

La méthode GetHashCode peut être remplacée par un type dérivé. Les types de valeur doivent remplacer cette méthode pour fournir une fonction de hachage appropriée pour ce type et pour fournir une distribution utile dans une table de hachage. Pour l'unicité, le code de hachage doit être basé sur la valeur d'un champ ou d'une propriété d'instance, au lieu d'un champ ou d'une propriété statique.

Les objets utilisés en tant que clé dans un objet Hashtable doivent également remplacer la méthode GetHashCode car ils doivent générer leur propre code de hachage. Si un objet utilisé en tant que clé ne fournit pas une implémentation utile de GetHashCode, vous pouvez spécifier un fournisseur de code de hachage lors de la construction de l'objet Hashtable. Avant la version 2.0 de .NET Framework, le fournisseur de code de hachage était basé sur l'interface System.Collections.IHashCodeProvider. À partir de la version 2.0, le fournisseur de code de hachage est basé sur l'interface System.Collections.IEqualityComparer.

Fondamentalement, des codes de hachage existent pour rendre les hashtables possibles.
Il est garanti que deux objets identiques ont des codes de hachage égaux.
Deux objets inégaux ne sont pas garantis avec des codes de hachage inégaux (cela s'appelle une collision).

98
SLaks

Après avoir appris de quoi il s'agissait, j'ai pensé écrire une explication plus simple, espérons-le, par analogie:

Pensez à un Hashcode comme si nous essayions d'identifier de manière unique quelqu'un

Je suis détective, à la recherche d'un criminel. Appelons-le M. Cruel. (Il était un meurtrier notoire quand j'étais enfant - il est entré par effraction dans une maison kidnappée et a assassiné une pauvre fille, a jeté son corps et il est toujours en liberté - mais c'est une affaire distincte). M. Cruel a certaines caractéristiques particulières que je peux utiliser pour l'identifier de manière unique parmi une mer de personnes. Nous avons 25 millions d'habitants en Australie. L'un d'eux est M. Cruel. Comment pouvons-nous le trouver?

Mauvais moyens d'identifier Mr Cruel

Apparemment, M. Cruel a les yeux bleus. Cela n’aide pas beaucoup car près de la moitié de la population australienne a également les yeux bleus.

Bonnes manières d'identifier Mr Cruel

Que puis-je utiliser? Je sais: je vais utiliser une empreinte digitale!

Avantages:

  • Il est vraiment très difficile pour deux personnes d’avoir la même empreinte digitale (pas impossible, mais extrêmement improbable).
  • L'empreinte digitale de M. Cruel ne changera jamais.
  • Chaque partie de l'être entier de M. Cruel: son apparence, la couleur de ses cheveux, sa personnalité, ses habitudes alimentaires, etc. doit (idéalement) se refléter dans son empreinte digitale, de sorte que s'il a un frère (qui est très semblable mais pas identique), les deux devrait avoir différent empreintes digitales. Je dis "devrait" parce que nous ne pouvons pas garantir à 100% que deux personnes dans ce monde auront des empreintes digitales différentes.
  • Mais nous pouvons toujours garantir que M. Cruel aura toujours la même empreinte digitale et que son empreinte digitale ne changera JAMAIS.

Les caractéristiques ci-dessus donnent généralement de bonnes fonctions de hachage.

Alors, quel est le problème avec 'Collisions'?

Alors imaginez si je reçois une piste et que je trouve quelqu'un qui correspond aux empreintes digitales de M. Cruel. Est-ce que cela signifie que j'ai trouvé M. Cruel?

........ peut-être! Je dois regarder de plus près. Si j'utilise SHA256 (une fonction de hachage) et que je cherche dans une petite ville avec seulement 5 personnes, alors il y a de grandes chances que je le trouve! Mais si j'utilise MD5 (une autre fonction de hachage célèbre) et que je vérifie les empreintes digitales dans une ville de + 2 ^ 1 000 personnes, il est donc assez probable que deux personnes entièrement différentes puissent avoir la même empreinte.

Alors, quel est l'avantage de tout cela de toute façon?

Le seul avantage réel des codes de hachage est que si vous voulez mettre quelque chose dans une table de hachage - et avec les tables de hachage, vous souhaitez rechercher rapidement des objets - et c'est là que le code de hachage entre en jeu. Ils vous permettent de vraiment trouver des éléments dans les tables de hachage rapidement. C'est un hack qui améliore considérablement les performances, mais à un coût réduit en précision.

Alors imaginons que nous ayons une table de hachage remplie de personnes - 25 millions de suspects en Australie. M. Cruel est quelque part à l'intérieur ..... Comment pouvons-nous le trouver vraiment rapidement? Nous devons tous les trier: trouver une correspondance potentielle ou acquitter de toute autre manière les suspects potentiels. Vous ne voulez pas prendre en compte les caractéristiques uniques de chaque personne car cela prendrait trop de temps. Que utiliseriez-vous à la place? Vous utiliseriez un hashcode! Un hashcode peut vous dire si deux personnes sont différentes. Si Joe Bloggs n'est pas M. Cruel. Si les empreintes ne correspondent pas, alors vous savez que ce n'est certainement pas M. Cruel. Mais, si les empreintes digitales correspondent, alors, en fonction de la fonction de hachage que vous avez utilisée, les chances que vous trouviez votre homme sont déjà assez bonnes. Mais ce n'est pas à 100%. La seule façon dont vous pouvez être certain est d'enquêter davantage: (i) avait-il/elle eu l'occasion/le motif, (ii) les témoins, etc.

Lorsque vous utilisez des ordinateurs Si deux objets ont la même valeur de code de hachage, vous devez à nouveau rechercher plus avant s'ils sont vraiment égaux. par exemple. Vous devez vérifier si les objets ont par exemple même hauteur, même poids, etc., si les nombres entiers sont identiques ou si le paramètre customer_id est une correspondance, puis déterminez s’ils sont identiques. cela se fait généralement peut-être en implémentant des interfaces IComparer ou IEquality.

Résumé de la clé

Donc, fondamentalement, un hashcode est une empreinte digitale.

Digital Fingerprint - Picture attribute to Pixabay - Freely available for use at: https://pixabay.com/en/finger-fingerprint-security-digital-2081169/

  1. Deux personnes/objets différents peuvent théoriquement toujours avoir la même empreinte digitale. Ou en d'autres termes. Si vous avez deux empreintes digitales identiques, alors elles ne doivent pas nécessairement provenir de la même personne/du même objet.
  2. Cependant, la même personne/objet renvoie toujours la même empreinte digitale .
  3. Ce qui signifie que si deux objets retournent différent codes de hachage, vous savez avec une certitude à 100% que ces objets sont différents.

Il faut bien 3 minutes pour se faire une idée. Peut-être le lire quelques fois jusqu'à ce que cela ait du sens. J'espère que cela aidera quelqu'un parce qu'il m'a fallu beaucoup de peine pour tout apprendre!

198
BKSpurgeon

GetHashCode() est utilisé pour aider à l'utilisation de l'objet en tant que clé pour les tables de hachage. (Une chose similaire existe dans Java etc.). Le but est que chaque objet renvoie un code de hachage distinct, mais cela ne peut souvent pas être absolument garanti. C'est obligatoire bien que deux objets logiquement égaux renvoient le même code de hachage.

Une implémentation typique d'une table de hachage commence par la valeur hashCode, prend un module (limitant ainsi la valeur dans une plage) et l'utilise comme index dans un tableau de "compartiments".

11
seand

Ce n'est pas unique à WP7 - il est présent sur tous les objets .Net. Cela correspond en quelque sorte à ce que vous décrivez, mais je ne le recommanderais pas comme identifiant unique dans vos applications, car il n’est pas garanti qu’il soit unique.

Méthode Object.GetHashCode

8
Phil Sandler

Ceci est tiré de l'article msdn ici:

https://blogs.msdn.Microsoft.com/tomarcher/2006/05/10/are-hash-codes-unique/

"Bien que vous entendiez dire que les codes de hachage génèrent une valeur unique pour une entrée donnée, le fait est que, bien que difficile à accomplir, il est techniquement possible de trouver deux entrées de données différentes qui ont la même valeur. Cependant, les véritables facteurs déterminants de l'efficacité d'un algorithme de hachage résident dans la longueur du code de hachage généré et la complexité des données en cours de hachage. "

Il suffit donc d’utiliser un algorithme de hachage adapté à la taille de vos données et il aura des codes de hachage uniques.

4
Shree Harsha