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

Langage Java Discussion :

[Object ID]Comment identifier un objet de facon unique


Sujet :

Langage Java

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Points : 139
    Points
    139
    Par défaut [Object ID]Comment identifier un objet de facon unique
    Bonjour,

    Je dois stocker des objets dans une Map. La cle doit etre un identifiant unique de l'objet et la valeur l'objet lui meme.

    J'avais d'abord penser a utiliser la methode hashCode() pour determiner un identifiant de l'objet. Le probleme est je crois qu'elle est un peu couteuse, et mes objets sont assez monstreux. De plus si mes souvenirs sont bons deux objets differents peuvent avoir des hashCode identiques.
    Ma question est: est-ce qu'il existe une api (genre apache commons...), qui fournit des methodes permettant de generer des identifiants d'objets.

    J'espere avoir ete assez clair.

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Si tu ne l'as pas modifié, la méthode hashcode() hérité de Object fournit une valeur différente par instance (cela correspond même à l'adresse mémoire de l'objet avec les JVM de Sun).

    Tu peux récupérer cette valeur avec la méthode System.identityHashCode()...

    Je ne pense vraiment pas que ce soit coûteux en temps...

    a++

  3. #3
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Points : 139
    Points
    139
    Par défaut
    Le probleme est que deux objets identiques devraient me renvoyer un meme identifiant. Donc l'adresse memoire ne me suffit pas.

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bourbaki2003
    Le probleme est que deux objets identiques devraient me renvoyer un meme identifiant. Donc l'adresse memoire ne me suffit pas.
    Que veux-tu dire par identique ? identityHashcode() ne renvoit la même valeur que s'il s'agit de la même instance.

    a++

  5. #5
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Points : 139
    Points
    139
    Par défaut
    Par identique j'entends au sens de le methode equals.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyObject a = new MyObject();
    MyObject b = new MyObject();
    a == b renvoie false alors a.equals(b) renvoie true.

    Si je ne surcharge pas la methode hashCode, alors tu m'as dit qu'elle renvoyait l'adresse memoire de l'objet. Dans ce cas, a.hashCode() != b.hashCode()
    Alors que je voudrais qu'ils soient identiques.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    sauf erreur de ma part, les hashcode de deux objets identiques sont identiques

    String s1 = new String("Hello World");
    String s2 = new String("Hello World");
    System.out.println ("Hashcode s1 = " + s1.hashCode());
    System.out.println ("Hashcode s2 = " + s2.hashCode());

    donne

    Hashcode s1 = -862545276
    Hashcode s2 = -862545276

  7. #7
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Points : 139
    Points
    139
    Par défaut
    Mais la tu as teste sur deux objets de type String.

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par manitoba
    sauf erreur de ma part, les hashcode de deux objets identiques sont identiques
    C'est vrai lorsque la méthode hashCode() est correctement implémenté (ce qui est le cas pour String entre autre). Mais la méthode hashCode() de Object ne respectent pas cela, ou plutôt elle considère que tous les objets sont différents...

    Citation Envoyé par bourbaki2003
    Si je ne surcharge pas la methode hashCode, alors tu m'as dit qu'elle renvoyait l'adresse memoire de l'objet. Dans ce cas, a.hashCode() != b.hashCode()
    Alors que je voudrais qu'ils soient identiques.
    J'ai du mal à saisir ce que tu veux exactement ?
    • Un identifiant unique par instance ?
    • Un identifiant identique pour des instances différentes mais de même valeur ?
    a++

  9. #9
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Points : 139
    Points
    139
    Par défaut
    Oui exactement, un identifiant unique pour des instances differentes mais de meme valeur.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Points : 158
    Points
    158
    Par défaut
    je vois pas vraiment ce que tu peux faire d'autre que d'implémenter ta propre version de hashCode()

    un truc bête genre : tu généres une string caractéristique de la valeur de l'objet (si c'est possible) et tu renvoit le hashcode de cette string.

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par manitoba
    un truc bête genre : tu généres une string caractéristique de la valeur de l'objet (si c'est possible) et tu renvoit le hashcode de cette string.
    Attention: un hashcode n'est pas forcément unique, et deux objets différents peuvent avoir le même hashcode...

    Le plus simple serait d'utiliser directement une String comme clef. après pour déterminer son contenu cela dépend des caractéristiques de ton objet...

    a++

  12. #12
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Points : 139
    Points
    139
    Par défaut
    Merci pour vos reponses. Je vais tester ca.

  13. #13
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Citation Envoyé par bourbaki2003
    Bonjour,

    Je dois stocker des objets dans une Map. La cle doit etre un identifiant unique de l'objet et la valeur l'objet lui meme.

    J'avais d'abord penser a utiliser la methode hashCode() pour determiner un identifiant de l'objet. Le probleme est je crois qu'elle est un peu couteuse, et mes objets sont assez monstreux. De plus si mes souvenirs sont bons deux objets differents peuvent avoir des hashCode identiques.
    Ma question est: est-ce qu'il existe une api (genre apache commons...), qui fournit des methodes permettant de generer des identifiants d'objets.

    J'espere avoir ete assez clair.

    Merci d'avance.
    Je suis perdu dans ce fils de discussion.

    Si tu veux retrouver une instance précise en fonction d'une autre instance qui aurrait la même valeur ( equals() parlant).
    Il te suffit d'1 chose:

    1) Que le hashCode() et equals() soient consistant. c'est a dire que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         si "a.equals(b) == true" alors "a.hashCode() == b.hashCode()"
    donc tu dois apporter une attention particuliere a ces 2x méthodes

    Ensuite tes objets peuvent servir eux meme de clé au sein d'une Map ou directement mémorisé dans un HashSet par exemple.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 124
    Points : 159
    Points
    159
    Par défaut
    Si tes objets sont si volumineux et qu'ils risquent d'avoir les mêmes valeurs tu peux aussi mettre un attribut représentant le nombre d'occurence.

    Bref tu pourrais calculer le hashcode de l'objet à ajouter. Si ce hashcode existe déjà tu modifies le nombre d'occurences de cet objet au lieu d'en créer un 2ème qui ne diffère que par son adresse mémoire...

    Pour ce qui est du hashcode, je ne sais pas exactement comment il fonctionne. Selon la doc, il n'est pas nécessaire que 2 objets différents aient 2 hashcode différents, ce qui me laisse perplexe. Ou alors j'ai pas compris la phrase:
    It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.

  15. #15
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Citation Envoyé par yizashi
    Si tes objets sont si volumineux et qu'ils risquent d'avoir les mêmes valeurs tu peux aussi mettre un attribut représentant le nombre d'occurence.

    Bref tu pourrais calculer le hashcode de l'objet à ajouter. Si ce hashcode existe déjà tu modifies le nombre d'occurences de cet objet au lieu d'en créer un 2ème qui ne diffère que par son adresse mémoire...

    Pour ce qui est du hashcode, je ne sais pas exactement comment il fonctionne. Selon la doc, il n'est pas nécessaire que 2 objets différents aient 2 hashcode différents, ce qui me laisse perplexe. Ou alors j'ai pas compris la phrase:
    2x objets differents "equals() parlant" peuvent avoir le meme hashCode().
    Des collisiosn arriveront dans les HashMap, HashSet & co mais ce sera correctement géré. Ce sera moins efficace mais cela restera fonctionnelle.

    Par contre 2x objets identiques "equals() parlant" doivent avoir le meme hashCode() sous peine de problème dans l'utilisation de ces collections.

Discussions similaires

  1. Comment identifier une machine de manière unique ?
    Par jackfirst72 dans le forum Sécurité
    Réponses: 4
    Dernier message: 07/03/2007, 13h59
  2. Réponses: 2
    Dernier message: 30/01/2007, 09h02
  3. Réponses: 2
    Dernier message: 11/05/2006, 10h47
  4. Comment identifier une machine de facon unique ?
    Par BigBenQ dans le forum Développement
    Réponses: 14
    Dernier message: 19/12/2005, 08h36
  5. Comment mettre plusieurs objets ds un composant ?
    Par Fleury dans le forum Composants VCL
    Réponses: 7
    Dernier message: 24/05/2003, 17h34

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