IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#] Comment redéfinir GetHashCode() ?


Sujet :

C#

  1. #1
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut [C#] Comment redéfinir GetHashCode() ?
    Bonjour,

    j'ai une classe Point définie par deux coordonnées (X,Y) et je cherche à redéfinir la méthode GetHashCode de sorte à obtenir un identifiant entier unique qui soit égal pour deux instances de même coordonnées, et différentes sinon. Comment pourrais-je m'y prendre ?

    Merci d'avance.

  2. #2
    Membre expérimenté Avatar de del-dongo
    Inscrit en
    Mai 2003
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 147
    Par défaut
    les "best practices" veulent que lors de le redéfinition de la méthode "Equals", il faille redéfinir la méthode "GetHashCode()" (en effet deux objets retournant le même HashCode sont considérés comme égaux).

    Ces mêmes "best practices" veulent que l'on redéfinisse "GetHashCode" ainsi :
    en retournant la combinaison des hashCode de chacune des données membres à l'aide de l'opérateur XOR ( ou exclusif)
    Dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public override int GetHashCode()
    { return X.GetHashCode() ^ Y.GetHashCode();}

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut Re: [C#] Redéfinir GetHashCode()
    Citation Envoyé par pornik
    Bonjour,

    j'ai une classe Point définie par deux coordonnées (X,Y) et je cherche à redéfinir la méthode GetHashCode de sorte à obtenir un identifiant entier unique qui soit égal pour deux instances de même coordonnées, et différentes sinon. Comment pourrais-je m'y prendre ?

    Merci d'avance.
    Tel que le problème est posé, la réponse est simple : ce n'est pas possible.
    Si X et Y sont des Int32, il y a 2^64 combinaisons possibles : on ne peut pas les identifier de manière unique avec un Int32!

    Si c'est pour utiliser une collection de type HashTable, l'unicité n'est pas requise et la solution de del-dongo est valide.
    Ceci dit, la structure System.Drawing.Point n'offre-t-elle pas déjà cette fonction?

  4. #4
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut
    Merci à vous deux, je vais essayer ça!

    Nicolas, il est clair que l'utilisation de la classe Point du framework serait idéale, mais il s'agit là d'un exercice de cours et je n'ai pas cette liberté.

    Bonne fin de semaine

  5. #5
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par pornik
    Merci à vous deux, je vais essayer ça!

    Nicolas, il est clair que l'utilisation de la classe Point du framework serait idéale, mais il s'agit là d'un exercice de cours et je n'ai pas cette liberté.

    Bonne fin de semaine
    Ben en fait il suffit d'imiter ce que fait Point
    C'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public override int GetHashCode()
    { return (this.x ^ this.y);}

  6. #6
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut
    Merci, c'est bien ce que del-dongo proposait. Mais je me demande quelle est l'utilité du hashage étant donné que j'obtiendrai une valeur similaire pour un point (X,Y) et (Y,X), et que la valeur de hash n'est donc pas différente pour chaque couple différent...

    Je vois aussi que cela n'est pas possible d'après l'explication de NicolasG. Que dois-je comprendre ?

  7. #7
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut
    Bon, d'après la MSDN, l'unicité du hashcode n'est pas garantie et il ne faut pas se baser dessus pour identifier un objet de manière unique.

    D'autres sources m'ont appris que les tables de hashage se baseraient d'abord sur le hashcode pour déterminer les candidats, puis appelleraient Equals.

    Quelqu'un peut-il confirmer ?

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Tu dois comprendre que la fonction GetHashCode ne sert pas à identifier un objet. L'important est de s'assurer que si A = B alors HashCode(A) = HashCode(B) mais ce n'est pas vrai dans l'autre sens et ce n'est pas ce qui compte.

    Ensuite il faut que la répartition de tes objets celon leur code de hachage soit uniforme si tu veux optimiser les structures et algo qui se basent dessus. Par exemple renvoyer toujours 0 comme hashcode vérifie la condition précédente mais la répartition est trés mauvaise, puisque tous tes objets ont le même hashcode. Si tu utilises ces objets comme clées d'une hashtable, celle ci sera trés peu performante (elle mettre tout le monde dans le même panier puis testera sur chaque objet qu'elle contient l'egalité avec l'objet que tu cherches). ça fonctionne mais c'est lent. Par contre si tu ne vérifies plus la condition, c'est a dire que deux objets egaux te renvoient un Hashcode différent, alors là ta Hashtable ne fonctionnera meme plus, elle n'arrivera plus a retrouver ses petits

  9. #9
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut
    Okay, c'est enfin clair Merci à vous tous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment redéfinir .approveSelection() de JFileChooser
    Par darioo2 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 23/01/2012, 20h16
  2. Réponses: 9
    Dernier message: 06/08/2010, 10h15
  3. Réponses: 0
    Dernier message: 26/11/2007, 15h47
  4. Comment redéfinir la couleur du texte d'un input
    Par mateuil dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 27/06/2007, 03h01
  5. Comment redéfinir les raccourcis claviers eclipse ?
    Par Robiwan59 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 04/05/2007, 10h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo