Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1285 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Calculer un hashcode à partir de 5 entiers

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Calculer un hashcode à partir de 5 entiers

n°552301
El_gringo
Posté le 28-10-2003 à 11:17:40  profilanswer
 

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 ?

mood
Publicité
Posté le 28-10-2003 à 11:17:40  profilanswer
 

n°552378
bartleby
Posté le 28-10-2003 à 11:47:30  profilanswer
 

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

n°552384
El_gringo
Posté le 28-10-2003 à 11:51:23  profilanswer
 

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.

n°552400
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 28-10-2003 à 12:11:44  profilanswer
 

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.
n°552412
El_gringo
Posté le 28-10-2003 à 12:18:05  profilanswer
 

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 ?

n°552414
kadreg
profil: Utilisateur
Posté le 28-10-2003 à 12:20:01  profilanswer
 

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 !
n°552415
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 28-10-2003 à 12:20:08  profilanswer
 

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.
n°552419
El_gringo
Posté le 28-10-2003 à 12:22:36  profilanswer
 

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]

n°552437
El_gringo
Posté le 28-10-2003 à 12:31:24  profilanswer
 

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 ?

n°552454
bartleby
Posté le 28-10-2003 à 12:43:05  profilanswer
 

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...

mood
Publicité
Posté le 28-10-2003 à 12:43:05  profilanswer
 

n°552455
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 28-10-2003 à 12:43:05  profilanswer
 

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.
n°552456
bartleby
Posté le 28-10-2003 à 12:44:20  profilanswer
 

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
n°552460
LetoII
Le dormeur doit se réveiller
Posté le 28-10-2003 à 12:52:18  profilanswer
 

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
n°552462
LetoII
Le dormeur doit se réveiller
Posté le 28-10-2003 à 12:53:38  profilanswer
 

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
n°552481
benou
Posté le 28-10-2003 à 13:17:59  profilanswer
 

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
n°552553
El_gringo
Posté le 28-10-2003 à 14:14:02  profilanswer
 

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.

n°552557
Krueger
tout salaire demande dutravail
Posté le 28-10-2003 à 14:15:35  profilanswer
 

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
n°552565
El_gringo
Posté le 28-10-2003 à 14:19:13  profilanswer
 

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...

n°552566
Krueger
tout salaire demande dutravail
Posté le 28-10-2003 à 14:19:51  profilanswer
 

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
n°552568
the real m​oins moins
Posté le 28-10-2003 à 14:20:43  profilanswer
 

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


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°552573
El_gringo
Posté le 28-10-2003 à 14:22:16  profilanswer
 

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 ?

n°552578
darklord
You're welcome
Posté le 28-10-2003 à 14:24:53  profilanswer
 

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
n°552579
LetoII
Le dormeur doit se réveiller
Posté le 28-10-2003 à 14:25:33  profilanswer
 

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
n°552580
the real m​oins moins
Posté le 28-10-2003 à 14:26:42  profilanswer
 

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 ?
n°552587
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 28-10-2003 à 14:32:15  profilanswer
 

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.
n°552588
the real m​oins moins
Posté le 28-10-2003 à 14:33:58  profilanswer
 

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 ?
n°552589
El_gringo
Posté le 28-10-2003 à 14:34:08  profilanswer
 

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.

n°552591
the real m​oins moins
Posté le 28-10-2003 à 14:35:30  profilanswer
 

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 ?
n°552593
LetoII
Le dormeur doit se réveiller
Posté le 28-10-2003 à 14:36:17  profilanswer
 

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
n°552597
nraynaud
lol
Posté le 28-10-2003 à 14:37:09  profilanswer
 

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

n°552602
darklord
You're welcome
Posté le 28-10-2003 à 14:38:37  profilanswer
 

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
n°552607
El_gringo
Posté le 28-10-2003 à 14:39:18  profilanswer
 

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.

n°552613
El_gringo
Posté le 28-10-2003 à 14:41:32  profilanswer
 

nraynaud a écrit :

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


 
T'as une idée Einstein ?

n°552615
nraynaud
lol
Posté le 28-10-2003 à 14:45:29  profilanswer
 

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.

n°552618
El_gringo
Posté le 28-10-2003 à 14:48:27  profilanswer
 

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.

n°552624
souk
Tourist
Posté le 28-10-2003 à 14:55:16  profilanswer
 

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 .
n°552628
LetoII
Le dormeur doit se réveiller
Posté le 28-10-2003 à 14:58:22  profilanswer
 

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
n°552635
souk
Tourist
Posté le 28-10-2003 à 15:01:57  profilanswer
 

alors il va falloir 160 bits :D


---------------
L'inventeur de la cédille est un certain monsieur Groçon .
n°552636
benou
Posté le 28-10-2003 à 15:03:16  profilanswer
 

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
n°552638
nraynaud
lol
Posté le 28-10-2003 à 15:03:45  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Calculer un hashcode à partir de 5 entiers

 

Sujets relatifs
appeler un script PHP a partir d'une feuille XSLT ????[PHP] entiers 64 bits ??
Recuperer le répertoire de lancement d'un process à partir de son nomacceder a partir de VB a base de donnée en Access
programme ASP permettant d'afficher en gras ou en italique les entiersJutilise un xml a partir de flash mais je peux pas metre dimage !?!
lancer un exe sur un serveur IIS à partir d'une autre machine[Une colle] Lire un fichier texte à partir du poste d'un client.
Raffraichir une frame avec un JS à partir d'un popupTrouver une date Y-m-d à partir d'une date U [ - Job's Done - ]
Plus de sujets relatifs à : Calculer un hashcode à partir de 5 entiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR