Calculer un hashcode à partir de 5 entiers

Calculer un hashcode à partir de 5 entiers - Java - Programmation

Marsh Posté le 28-10-2003 à 11:17:40    

L'identité des instances d'une class que j'ai créé est faite par 5 entiers. Sachant que ceux-ci ne sont pas bornés, vous voyez un moyen de calculer un hashcode de ces objets ?

Reply

Marsh Posté le 28-10-2003 à 11:17:40   

Reply

Marsh Posté le 28-10-2003 à 11:47:30    

Euh, reponse bateau, mais :
 
Pourquoi ne pas faire un String :
String taString = ""+entier1+enteri2....
 
avec tes 5 entiers et appeler taString.hashCode() ?

Reply

Marsh Posté le 28-10-2003 à 11:51:23    

C'est sans doute ce que je vais faire, parce que je vois pas d'autre possibilité.
Par contre dans la soluce que tu me propose, il manque qqch :
iMonentier1=1 et iMonEntier2=11
sera considéré de la même façon que iMonentier1=11 et iMonEntier2=1
Il faut donc avant que la réprésentation ss forme de String comporte toujours le même nombre de chiffres (0 devant si nécessaire).
Merci.

Reply

Marsh Posté le 28-10-2003 à 12:11:44    

Bin faut utiliser un algo de hash [:spamafote]
Mate dans javax.security, y a MessageDigest qui fera c'que tu cherches avec un algo type MD5. Maintenant, MD5 c'est p'têt un peu violent, je sais pas.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 28-10-2003 à 12:18:05    

Taiche a écrit :

Bin faut utiliser un algo de hash [:spamafote]
Mate dans javax.security, y a MessageDigest qui fera c'que tu cherches avec un algo type MD5. Maintenant, MD5 c'est p'têt un peu violent, je sais pas.


 
MD5 c'est pas pour du codage ?

Reply

Marsh Posté le 28-10-2003 à 12:20:01    

El_gringo a écrit :


 
MD5 c'est pas pour du codage ?


 
non, c'est pour du hash


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 28-10-2003 à 12:20:08    

MD5 est un algorithme de hashage. Il est souvent utilisé avec Random et d'autres trucs pour obtenir des UUID mais il n'a pas pour vocation de crypter/décrypter des données.
Mate un peu sur Gougueule, tu verras bien :o


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 28-10-2003 à 12:22:36    

Taiche a écrit :

MD5 est un algorithme de hashage. Il est souvent utilisé avec Random et d'autres trucs pour obtenir des UUID mais il n'a pas pour vocation de crypter/décrypter des données.
Mate un peu sur Gougueule, tu verras bien :o


 
Mais j'te crois, t'emballe pas ! [:sisicaivrai]

Reply

Marsh Posté le 28-10-2003 à 12:31:24    

Mais en fait, je vois pas comment utiliser MessageDigest :(

Code :
  1. int iMonEntier1, le2, le3, le4, le5
  2. MessageDigest md = MessageDigest.getInstance("MD5" );
  3. md.update(iMonEntier1);
  4. md.update(le2);
  5. md.update(le3);
  6. md.update(le4);
  7. md.update(le5);
  8. byte[] digestion = md.digest();
  9. // après je me démerde pour en tirer nu entier


 
C comme ça que ça marche ?

Reply

Marsh Posté le 28-10-2003 à 12:43:05    

Euh, je ferais plutot comme ca:
 

Code :
  1. int iMonEntier1, le2, le3, le4, le5
  2. MessageDigest md = MessageDigest.getInstance("MD5" );
  3. byte[] tab = new byte[5];
  4. tab[0]=new Integer(iMonEntier1).byteValue();
  5. tab[1]=new Integer(ie2).byteValue();
  6. tab[2]=new Integer(ie3).byteValue();
  7. tab[3]=new Integer(ie4).byteValue();
  8. tab[4]=new Integer(ie5).byteValue();
  9. md.update(tab);
  10. byte[] digestion = md.digest();
  11. // après je me démerde pour en tirer nu entier

 
 
Sinon, tu utilises seulement ie5 pour hasher...

Reply

Marsh Posté le 28-10-2003 à 12:43:05   

Reply

Marsh Posté le 28-10-2003 à 12:43:05    

C'est pas facile [:ddr555]
Cherche des exemples de code sur l'Net ou même sur le forum, j'me souviens que la question avait été posée. C'était pour calculer un UUID mais y a la méthode pour récupérer ton hashcode sous forme de String.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 28-10-2003 à 12:44:20    

Tiens, je viens de retrouver un vieux bout de code dans lequel je crypter en MD5 avant de faire une insertion MySQL ( avant de découvrir qu'il existe une fct MD5() dans MySQL !!
 

Code :
  1. /**  
  2.     *  helper method for MD5 functions  
  3.     *  
  4.     */
  5.     private static String toHex(byte[] digest) {
  6.     StringBuffer buf = new StringBuffer();
  7.     for (int i = 0; i < digest.length; i++) {
  8.      buf.append(Integ er.toHexString(0x0100 + (digest[i] & 0x00ff)).substring(1));
  9.     }
  10.     return buf.toString();
  11.     }
  12.     String hash = "";
  13.     String nPassword = newPassword + java.lang.Math.round(java.lang.Math.random()*10000);
  14.     try {
  15.      MessageDigest md = MessageDigest.getInstance("MD5" );
  16.      hash = login + ":" + nPassword;
  17.      byte[] rawPass = hash.getBytes();
  18.      try { md.update(rawPass); }
  19.      catch (Exception e) {  }
  20.      password = toHex(md.digest());
  21.     } catch (NoSuchAlgorithmException nsae) {
  22.           }


Message édité par bartleby le 28-10-2003 à 12:45:07
Reply

Marsh Posté le 28-10-2003 à 12:52:18    

Heu, si t'as pas envie de te faire chier tu peux aussi faire plus simple avec la moyenne des 5 entiers ou tout autre combinaison plus ou moin linéaire.


---------------
Le Tyran
Reply

Marsh Posté le 28-10-2003 à 12:53:38    

El_gringo a écrit :

C'est sans doute ce que je vais faire, parce que je vois pas d'autre possibilité.
Par contre dans la soluce que tu me propose, il manque qqch :
iMonentier1=1 et iMonEntier2=11
sera considéré de la même façon que iMonentier1=11 et iMonEntier2=1
Il faut donc avant que la réprésentation ss forme de String comporte toujours le même nombre de chiffres (0 devant si nécessaire).
Merci.


 
C pas nécessairement vrai:
 

Citation :


As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)  
 


 
Edit: En y repensant y a un truc qui me chiffonait, et heuresument la méthode est surchargée au niveau des String  [:ddr555]


Message édité par LetoII le 28-10-2003 à 12:58:32

---------------
Le Tyran
Reply

Marsh Posté le 28-10-2003 à 13:17:59    

Code :
  1. public int hashcode() {
  2. return i1+i2+i3+i4+i5;
  3. }


ca suffira dans la plupart des cas ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 28-10-2003 à 14:14:02    

Mais en fait je me suis peut être mal exprimé. Je suis pas sur que ce soit un hashcode que je recherche.
La seule chose que je veux, c'est un identifiant, sachant que :
2 objets ayant au moins 1 des 5 entiers caractéristiques différents n'auront jamais le même identifiant.
2 objets ayant les mêmes valeurs pour ces 5 entiers auront toujours le même identifiant.

Reply

Marsh Posté le 28-10-2003 à 14:15:35    

Ou alors tu imprimes ces nombres dans un String avec le signe et un nombre fixe de chiffres chacun (10 pour un int). C'est plus lent, mais plus fiable.


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 28-10-2003 à 14:19:13    

Krueger a écrit :

Ou alors tu imprimes ces nombres dans un String avec le signe et un nombre fixe de chiffres chacun (10 pour un int). C'est plus lent, mais plus fiable.


 
Merci, mais c'est ce que j'ai dis que j'allais surement faire (cf mon 2e post).
Par curiosité (et soucis d'optimisation), je cherche qd même une soluce par les entiers...

Reply

Marsh Posté le 28-10-2003 à 14:19:51    

El_gringo a écrit :

Mais en fait je me suis peut être mal exprimé. Je suis pas sur que ce soit un hashcode que je recherche.
La seule chose que je veux, c'est un identifiant, sachant que :
2 objets ayant au moins 1 des 5 entiers caractéristiques différents n'auront jamais le même identifiant.
2 objets ayant les mêmes valeurs pour ces 5 entiers auront toujours le même identifiant.
 


Si si, c'est bien un hashCode qui pourra te faire l'affaire, pourvu qu'il soit implémenté conformément à la documentation de la méthode hashCode de la classe java.lang.Object.


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 28-10-2003 à 14:20:43    

tain faut s'calmer ici, un hashCode d'entiers calculé avec un MessageDigest [:autobot]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 28-10-2003 à 14:22:16    

the real moins moins a écrit :

tain faut s'calmer ici, un hashCode d'entiers calculé avec un MessageDigest [:autobot]


 
ça bouffe des ressources un MD5 ?
Et, sinon, t'as une solution toi ?

Reply

Marsh Posté le 28-10-2003 à 14:24:53    

benou a écrit :

Code :
  1. public int hashcode() {
  2. return i1+i2+i3+i4+i5;
  3. }


ca suffira dans la plupart des cas ...


 

Citation :


Monentier1=1 et iMonEntier2=11
sera considéré de la même façon que iMonentier1=11 et iMonEntier2=1  


 
:heink:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 28-10-2003 à 14:25:33    

Krueger a écrit :


Si si, c'est bien un hashCode qui pourra te faire l'affaire, pourvu qu'il soit implémenté conformément à la documentation de la méthode hashCode de la classe java.lang.Object.


 
Nan, la doc indique expressément qu'il n'est pas nécessaire que le hashcode de deux objets non égaux n'est pas nécessairement différent.


---------------
Le Tyran
Reply

Marsh Posté le 28-10-2003 à 14:26:42    

El_gringo a écrit :


 
ça bouffe des ressources un MD5 ?
Et, sinon, t'as une solution toi ?

ben c'est surtout que ça a pas de rapport quoi
 
moi je ferais un truc dans le genre de ce que benou à proposé, eventuellement en donnant plus de poids à l'un ou l'autre des entiers selon ta logique... si c'est pour foutre les trucs dans une hashmap par exemple, c bon.. si tu redefinis aussi equals()  
 
...mais ça depend ce que tu veux faire de ton truc :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 28-10-2003 à 14:32:15    

the real moins moins a écrit :

tain faut s'calmer ici, un hashCode d'entiers calculé avec un MessageDigest [:autobot]


Ba tout dépend de l'utilisation, hein [:spamafote]
On demande du hashcode, j'sors la possibilité d'utiliser un algo de hash, c'est tout. Maintenant, si c'est pour un truc tout con qui doit tenir dans un int, effectivement y a mieux, mais pour un truc industriel dont la fiabilité sera requise avant tout, bin vaut mieux passer par des trucs sur 128 bits :o
 
Gringo : ui, ça bouffe des perfos, je crois. Maintenant, à toi de voir ce dont tu as besoin. Apparemment, c'est un identifiant unique mais faut voir dans quel contexte tu l'utiliseras.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 28-10-2003 à 14:33:58    

Taiche a écrit :


Ba tout dépend de l'utilisation, hein [:spamafote]
On demande du hashcode, j'sors la possibilité d'utiliser un algo de hash, c'est tout. Maintenant, si c'est pour un truc tout con qui doit tenir dans un int,  

ben ui, un hashCode quoi :o
(ou alors j'ai rien compris [:autobot])


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 28-10-2003 à 14:34:08    

the real moins moins a écrit :

ben c'est surtout que ça a pas de rapport quoi
 
moi je ferais un truc dans le genre de ce que benou à proposé, eventuellement en donnant plus de poids à l'un ou l'autre des entiers selon ta logique... si c'est pour foutre les trucs dans une hashmap par exemple, c bon.. si tu redefinis aussi equals()  
 
...mais ça depend ce que tu veux faire de ton truc :o


 
Nan, le truc de benou, ça me va pas. En pnodérant l'un ou l'autre des entiers non plus.
Cf mon post :
 

El_gringo :


Mais en fait je me suis peut être mal exprimé. Je suis pas sur que ce soit un hashcode que je recherche.
La seule chose que je veux, c'est un identifiant, sachant que :
2 objets ayant au moins 1 des 5 entiers caractéristiques différents n'auront jamais le même identifiant.
2 objets ayant les mêmes valeurs pour ces 5 entiers auront toujours le même identifiant.

Reply

Marsh Posté le 28-10-2003 à 14:35:30    

ben en ponderant les 5 entiers differement, en fonction de leur valeur max, ça peut le faire, si tu veux ABSOLUMENT que ta 1e regle soit respectée [:spamafote]
 
tu dis tjs pas à quoi va te servir cet id...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 28-10-2003 à 14:36:17    

Heu, tu fais une classe Identifiant où tu remet les 5 entiers et tu surcharge equals? :o


Message édité par LetoII le 28-10-2003 à 14:38:31

---------------
Le Tyran
Reply

Marsh Posté le 28-10-2003 à 14:37:09    

Attention à la fracture du neurone les gens dans ce topic.

Reply

Marsh Posté le 28-10-2003 à 14:38:37    

El_gringo a écrit :


 
Nan, le truc de benou, ça me va pas. En pnodérant l'un ou l'autre des entiers non plus.
Cf mon post :


 
grilled :o


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 28-10-2003 à 14:39:18    

the real moins moins a écrit :

ben en ponderant les 5 entiers differement, en fonction de leur valeur max, ça peut le faire, si tu veux ABSOLUMENT que ta 1e regle soit respectée [:spamafote]


 
J'ai précisé au début qu'aucun de ces entier n'est pas borné -> pas de la valeur max (ou moins tous la même : celle d'un int).
 

the real moins moins a écrit :


tu dis tjs pas à quoi va te servir cet id...


 
Parce que ça change pas grand chose, si !?
Enfin, si tu veux. Ces objets sont des Bean, récupérés depuis une base de donnée. Chaque bean correspond à un enregistrement dans une table en bd. Dans cette table, l'unicité de chaque enregistrement est assurée par 5 champs de type int. je veut reproduire ça dans mon bean, et pouvior identifier un enregistrement. Voila.

Reply

Marsh Posté le 28-10-2003 à 14:41:32    

nraynaud a écrit :

Attention à la fracture du neurone les gens dans ce topic.


 
T'as une idée Einstein ?

Reply

Marsh Posté le 28-10-2003 à 14:45:29    

El_gringo a écrit :


T'as une idée Einstein ?

Fais un résumé clair de ton problème vu qu'apparement il a changé au cours du topic. Mais je sens à plein nez que ça va se finir par 4 additions.

Reply

Marsh Posté le 28-10-2003 à 14:48:27    

nraynaud a écrit :

Fais un résumé clair de ton problème vu qu'apparement il a changé au cours du topic. Mais je sens à plein nez que ça va se finir par 4 additions.


 
Le problème n'a pas changé.
Tu veux bien foutre 30 Secondes tes airs supérieurs au placard ?
 
Ennoncé on n'peux plus clair (tu tailles sans même savoir ce qu'on cherche à faire !? :


La seule chose que je veux, c'est un identifiant, sachant que :
2 objets ayant au moins 1 des 5 entiers caractéristiques différents n'auront jamais le même identifiant.
2 objets ayant les mêmes valeurs pour ces 5 entiers auront toujours le même identifiant.

Reply

Marsh Posté le 28-10-2003 à 14:55:16    

El_gringo a écrit :


 
J'ai précisé au début qu'aucun de ces entier n'est pas borné -> pas de la valeur max (ou moins tous la même : celle d'un int).
 
 
 
Parce que ça change pas grand chose, si !?
Enfin, si tu veux. Ces objets sont des Bean, récupérés depuis une base de donnée. Chaque bean correspond à un enregistrement dans une table en bd. Dans cette table, l'unicité de chaque enregistrement est assurée par 5 champs de type int. je veut reproduire ça dans mon bean, et pouvior identifier un enregistrement. Voila.
 


 
si tu veux assurer l'unicite, c'est pas un hashcode, et la seule facon c'est de definir une application bijective qui a 5 entiers en associe 1. Un int etant sur n bit en java (je mets n parce que je ne suis pas sur, je crois que c'est 16), il te faut 5n bits a l'arrivee.  
apres, il y a une foultitude de bijections, la plus simple etant de mettre les bits bout a bout ;)


---------------
L'inventeur de la cédille est un certain monsieur Groçon .
Reply

Marsh Posté le 28-10-2003 à 14:58:22    

souk a écrit :


 
si tu veux assurer l'unicite, c'est pas un hashcode, et la seule facon c'est de definir une application bijective qui a 5 entiers en associe 1. Un int etant sur n bit en java (je mets n parce que je ne suis pas sur, je crois que c'est 16), il te faut 5n bits a l'arrivee.  
apres, il y a une foultitude de bijections, la plus simple etant de mettre les bits bout a bout ;)  


 
C'est 32 bits le int en java ;)


---------------
Le Tyran
Reply

Marsh Posté le 28-10-2003 à 15:01:57    

alors il va falloir 160 bits :D


---------------
L'inventeur de la cédille est un certain monsieur Groçon .
Reply

Marsh Posté le 28-10-2003 à 15:03:16    

DarkLord a écrit :


Citation :


Monentier1=1 et iMonEntier2=11
sera considéré de la même façon que iMonentier1=11 et iMonEntier2=1  


 
:heink:


et alors ? ca respecte la règle du hashcode ...  
 
j'avais pas compris que ce qu'il voulait n'était pas ce qu'il avait demandé :o


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 28-10-2003 à 15:03:45    

El_gringo a écrit :


La seule chose que je veux, c'est un identifiant, sachant que :
2 objets ayant au moins 1 des 5 entiers caractéristiques différents n'auront jamais le même identifiant.
2 objets ayant les mêmes valeurs pour ces 5 entiers auront toujours le même identifiant.

T'as pas le choix t'es obligé de garder tes 5 entiers.
 
si tu avais viré la première règle, alors hashCode() servait à ça, en faisant 4 additions (pour rappel, les int java sont modulaires, c'est à dire qu'on peut les additionner tant qu'on veut, si on va plus loin que le plus grand représentable, ça "fait le tour" http://java.sun.com/docs/books/jls [...] html#51035 )
 
Concernant, ton problème, tu mets le code de Benou dans hashCode()
 
et dans equals tu mets  

Code :
  1. public boolean equals(Object other) {
  2.   if (other instanceof Taclasse) {
  3.     Taclass o = (Taclass) other;
  4.     if (o.hashCode() == this.hashCode())
  5.       return (i1 == o.i1)&&(i2 == o.i2) && ....
  6.     else
  7.       return false;
  8.   } else
  9.   return false
  10. }


 
Et tu utilises systématiquement equals() pour savoir si 2 instances sont pareilles.
 
Et tes instances sont leur propres identifiants.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed