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

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5
Auteur Sujet :

hashCode, qui s'en sert ?

n°797963
- Renaud -
Posté le 16-07-2004 à 18:10:50  profilanswer
 

Reprise du message précédent :

nraynaud a écrit :

PUTAIN, IL VA FALLOIR REPETER COMBIEN DE FOIS QUE LES TABLES DE HACHAGE EN JAVA N'UTILISENT PAS DES NOMBRES PREMIERS MAIS DES PUISSANCES DE 2 !!!!


 
bon, ben j'ai lu le lien, et il dit que c'est spécifique au 1.4
 
donc quand tu hurles, dis bien dans quel cadre tu le fais
 
PUTAIN, IL MANQUE QUE C'EST DEPUIS LE 1.4
 

mood
Publicité
Posté le 16-07-2004 à 18:10:50  profilanswer
 

n°797964
Jubijub
Parce que je le VD bien
Posté le 16-07-2004 à 18:13:02  profilanswer
 

[:popcorn]


---------------
Jubi Photos : Flickr - 500px
n°832466
Giz
Posté le 26-08-2004 à 08:28:11  profilanswer
 

Je viens d'utiliser, encore une autre fois, une hashtable.
Conclusion : j'ai explosé le tas dans le programme :/
A chaque itération, j'affiche la taille de ma table de hash (plus précisément, le nombre d'éléments qu'elle stocke), voilà la valeur des  3 dernières itérations :


oldSelectedSubSets.size = 59700
oldSelectedSubSets.size = 79572
oldSelectedSubSets.size = 99394


 
msg d'erreur à la prochaine itération :


Exception in thread "main" java.lang.OutOfMemoryError: Java heap space


 
Je suis assez étonné de la petite taille du tas :/. Cela vous paraît-t-il normal ? Je veux dire vous vous dîtes "oui, effectivement pour une table de hash, cela représente beaucoup d'éléments" ou bien "non, c'est ton prog qui alloue trop de mémoire en plus de la table de hash" ?  [:figti]


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
n°832474
benou
Posté le 26-08-2004 à 08:40:47  profilanswer
 

oui ca fait beaucoup pour une table de hashage.
mais sic'est normal que tu en ais autant, tu as qu'à augmenter la taille allouée à ta JVM : java -Xmx128m par exemple


---------------
ma vie, mon oeuvre - HomePlayer
n°832505
Giz
Posté le 26-08-2004 à 09:21:18  profilanswer
 

benou a écrit :

oui ca fait beaucoup pour une table de hashage.
mais sic'est normal que tu en ais autant, tu as qu'à augmenter la taille allouée à ta JVM : java -Xmx128m par exemple


 
OK. Mais cela craint, après il faut dire à l'utilisateur de paramétrer sa JVM pour exécuter l'appli  :??:  
Je pense plutôt borner le nombre d'éléments dans ma table de hash.


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
n°832583
Giz
Posté le 26-08-2004 à 10:50:05  profilanswer
 

Je viens de voir, je genere au tout début à l'initialisation de mon algo un tableau de 300 000 case, chacune pointant sur un tableau de 53 cases chacune contenant un int.
En taille mémoire cela répresente environ 60Mo.
Avec les réglages par défaut, la JVM me balance un "NoSuchMemoryError" malgré mes 512 Mo de ram :/


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
n°832607
benou
Posté le 26-08-2004 à 11:05:18  profilanswer
 

elle existe pas cette exception ...
et comme je te l'ai déjà dit, la jvm n'utilise pas toute la mémoire du PC si tu ne lui dis pas. Par défaut c'est 32Mo ou 64Mo max je crois ...
 
et c'est quoi ton prog là ?? tu simules l'univers ?


---------------
ma vie, mon oeuvre - HomePlayer
n°832716
Giz
Posté le 26-08-2004 à 12:40:43  profilanswer
 

benou a écrit :

elle existe pas cette exception ...
et comme je te l'ai déjà dit, la jvm n'utilise pas toute la mémoire du PC si tu ne lui dis pas. Par défaut c'est 32Mo ou 64Mo max je crois ...
 
et c'est quoi ton prog là ?? tu simules l'univers ?


 
je voulais dire :


Exception in thread "main" java.lang.OutOfMemoryError: Java heap space


 
;)
 
Sinon, euh, ouai presque  :whistle:


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
n°832779
the real m​oins moins
Posté le 26-08-2004 à 13:58:48  profilanswer
 

Giz a écrit :

NoSuchMemoryError


[:rofl2][:rofl2][:rofl2]
 
 
bonjour, la barrette de ram que vous avez demandée n'est pas disponible pour l'instant, veuillez s'il vous plait repasser plus tard, quand on aura terminé de ripper le dvd


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°833055
savory
Posté le 26-08-2004 à 16:55:20  profilanswer
 

Explication tres efficace benou :) j'adore

mood
Publicité
Posté le 26-08-2004 à 16:55:20  profilanswer
 

n°833773
Giz
Posté le 27-08-2004 à 10:08:47  profilanswer
 

En fait je crois avoir fait le GROS boulet  [:ke-c]  
En fait ma table de hash contient pour clé (qui est égale à la valeur aussi) un tableau de 100 int environ.
Donc avec quasi 100 000 entrées, ça commence à vite saturer.
Une solution nettement moins débile serait de convertir en String le tableau de 100 int et de récupérer le hashCode de cette String. Ainsi la table de hash aurait pour clé/valeur ce hashCode dépendant directement de la String et donc indirectement du tableau de 100 int.
Ainsi, la table de hash stockerait plus qu'un seul int (le hashCode) au lieu des 100 int pour chaque entrée.
Il en découle deux questions :
 
1) A partir de X String différentes, est-on SUR d'avoir X hashCode différents ? (je pense que oui, mais je n'ai pas le code source sous les yeux [:spamafote] )  
 
2) Si oui pour la question 1, alors à quoi sert de stocker des Object dans une hashtable alors qu'il suffirait juste de les convertir en String puis récupérer le hashCode. De plus, dans ce cas, il ne serait plus nécessaire de définir les méthodes "public int hashCode ()" et "boolean equals (Object o)" car le hashCode d'un Integer (qui serait égal à "new Integer (hashCode)" ) est automatique : java prends directement la intValue () comme clé.
 
Merci de vos réponses  :hello:


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
n°834233
benou
Posté le 27-08-2004 à 15:06:33  profilanswer
 

Giz a écrit :

En fait je crois avoir fait le GROS boulet  [:ke-c]  
En fait ma table de hash contient pour clé (qui est égale à la valeur aussi) un tableau de 100 int environ.
Donc avec quasi 100 000 entrées, ça commence à vite saturer.
Une solution nettement moins débile serait de convertir en String le tableau de 100 int et de récupérer le hashCode de cette String. Ainsi la table de hash aurait pour clé/valeur ce hashCode dépendant directement de la String et donc indirectement du tableau de 100 int.
Ainsi, la table de hash stockerait plus qu'un seul int (le hashCode) au lieu des 100 int pour chaque entrée.


non. Que la clef soit un tableau ou n'importe quel autre objet, la map ne va sauvegarder qu'un seul int pour le hashcode. Pourquoi ce serait autrement ?
 
Mais utiliser un tableau comme clef pour une table de hashage me parait assez habérant ... d'ailleur, je me demande comment le hascode  est calculé sur un tableau [:gratgrat]. Si je devais parrier je dirais que c'est l'implémentation de Object.
 
Elle te sert à quoi ta table de hashage ?
 

Giz a écrit :


1) A partir de X String différentes, est-on SUR d'avoir X hashCode différents ? (je pense que oui, mais je n'ai pas le code source sous les yeux [:spamafote] )  


ben non. réfléchis 2 sec ... si c'était le cas, ca voudrait dire qu'il ne peux exister que 2^32 chaines de caractères (puisqu'un int peut prendre 2^32 valeurs). Ce qui est bien évidement faux.
 
Si t'as pas compris ca, t'as pas du comprendre le fonctionnement de l'algo de hachage :/
 

Giz a écrit :


2) Si oui pour la question 1, alors à quoi sert de stocker des Object dans une hashtable alors qu'il suffirait juste de les convertir en String puis récupérer le hashCode. De plus, dans ce cas, il ne serait plus nécessaire de définir les méthodes "public int hashCode ()" et "boolean equals (Object o)" car le hashCode d'un Integer (qui serait égal à "new Integer (hashCode)" ) est automatique : java prends directement la intValue () comme clé.


quelle idée  [:w3c compliant]  
 
Tu crois vraiment que n'importe quel objet peut se transformer en String ? allez, juste un exemple : l'objet Univers, tu le représentes comment avec une String ?
Et même si c'était le cas, tu penses vraiment que ce serait performant de devoir convertir l'objet en String ?
 
C'est vraiment une drôle d'idée ...


---------------
ma vie, mon oeuvre - HomePlayer
n°835354
Giz
Posté le 29-08-2004 à 02:34:11  profilanswer
 

benou a écrit :

non. Que la clef soit un tableau ou n'importe quel autre objet, la map ne va sauvegarder qu'un seul int pour le hashcode. Pourquoi ce serait autrement ?
 
Mais utiliser un tableau comme clef pour une table de hashage me parait assez habérant ... d'ailleur, je me demande comment le hascode  est calculé sur un tableau [:gratgrat]. Si je devais parrier je dirais que c'est l'implémentation de Object.
 
Elle te sert à quoi ta table de hashage ?


 
Je ne suis pas d'accord avec toi : en fait, au départ, ma clé/valeur (je passe la même référence) est une instance de la classe SubSet.
Cette classe contient comme membre privé, une référence sur un tableau de int[]. Une instance de cette classe est utilisé comme clé/valeur de la table de hash (pour les put () et get () entre autres). Pour créer une  instance de cette classe SubSet, je dois lui fournir le tableau de référence (celui de 100 int). L'instance de la classe SubSet étant utlisée comme clé/valeur, je dois y définir les méthodes equals () et hashCode () donc. Or ces 2 méthodes, par exemple equals (), utilisent le tableau de 100 int (logique, equals () ne fait que comparer si c'est les memes). Conclusion : pour chaque instance, celle ci est présente dans la table de hash et par conséquent il existera toujours une référence qui pointera sur ce tableau de 100 int; il ne peut donc pas etre supprimé de la mémoire...d'ou la necessité de convertir en String le tableau et de prendre le hashCode de la String comme clé/valeur
 

benou a écrit :


ben non. réfléchis 2 sec ... si c'était le cas, ca voudrait dire qu'il ne peux exister que 2^32 chaines de caractères (puisqu'un int peut prendre 2^32 valeurs). Ce qui est bien évidement faux.
 
Si t'as pas compris ca, t'as pas du comprendre le fonctionnement de l'algo de hachage :/


 
Il est vrai que ta remarque est tout a fait logique, je n'y avais pas pensé  :jap: Ceci dit, j'aimerais bien connaître la proba que 2 String (de 100 caracteres dans mons cas) différentes fournissent le même hashCode  :heink: Je pense qu'elle est très faible (peut être peut-on se contenter de cette approximation :??:, cela dépend du programme)
 

benou a écrit :


quelle idée  [:w3c compliant]  
 
Tu crois vraiment que n'importe quel objet peut se transformer en String ? allez, juste un exemple : l'objet Univers, tu le représentes comment avec une String ?
Et même si c'était le cas, tu penses vraiment que ce serait performant de devoir convertir l'objet en String ?
 
C'est vraiment une drôle d'idée ...


 
Il est vrai que comme ma question 1) dans l'absolu est fausse, la question 2 n'a pas lieu d'être  :jap:  
Pour la performance, des moments il faut faire des choix : ou bien ton objet est referencé par la table de hash, auquel cas il sera toujours en mémoire (gain en temps et perte en mémoire car a la base ton Objet est la plupart du temps constitué de plusieurs variable de type primitif (int, double,etc...)), ou bien tu convertis ton objet en String, ce qui peut prendre du temps, et tu generes le hashCode de celle ci et ainsi ta table de hash ne retiendrait qu'un int (gain memoire, perte en temps). Pour le 2ème cas, comme tu l'as dit, dans l'absolu le hashCode peut etre le meme pour 2 String différentes. Maintenant, il m'interesserait de connaitre la proba que ce hashCode soit le meme.


Message édité par Giz le 29-08-2004 à 02:34:41
n°835407
benou
Posté le 29-08-2004 à 10:42:29  profilanswer
 

Giz a écrit :

Je ne suis pas d'accord avec toi : en fait, au départ, ma clé/valeur (je passe la même référence) est une instance de la classe SubSet.
Cette classe contient comme membre privé, une référence sur un tableau de int[]. Une instance de cette classe est utilisé comme clé/valeur de la table de hash (pour les put () et get () entre autres). Pour créer une  instance de cette classe SubSet, je dois lui fournir le tableau de référence (celui de 100 int). L'instance de la classe SubSet étant utlisée comme clé/valeur, je dois y définir les méthodes equals () et hashCode () donc. Or ces 2 méthodes, par exemple equals (), utilisent le tableau de 100 int (logique, equals () ne fait que comparer si c'est les memes). Conclusion : pour chaque instance, celle ci est présente dans la table de hash et par conséquent il existera toujours une référence qui pointera sur ce tableau de 100 int; il ne peut donc pas etre supprimé de la mémoire...d'ou la necessité de convertir en String le tableau et de prendre le hashCode de la String comme clé/valeur


bon ...
 
1) tu avais di que c'était un tableau de int qui était utilisé comme clef&valeur. Maintenant tu me dis que c'est un objet qui contient le tableau ... ca fait déjà une grosse différence ...
 
2) je compend rien à ton histoire de de "être supprimé de la mémoire" ou "nécessité de convertir en String" .  
 
3) Pour ton histoire de perf le fait de le transformer en String ne serts absolument à rien. Dans les cas où un hashCode est long à calculer, il suffit de faire du cache : la première fois tu le calcul et tu sauve sa valeur, et les fois suivantes tu retourne la valeur déjà calculée. C'est d'ailleur ce qui est fait dans l'objet String si tu regardes son code source.
 
4) pour ton histoire de proba, on s'en fout : D'abord parce que l'algo a certainement été choisit justement pour que cette proba soit faible. Et ensuite parce que c'est pas parce que pour 2 objets différents on a le même hashcode que c'est un problême ! D'autant plus que d'ans l'algorythme de hachage, le hasCode est toujours modulé => les hashCode modulés sont très souvent égaux pour des objets différents


---------------
ma vie, mon oeuvre - HomePlayer
n°835544
Giz
Posté le 29-08-2004 à 15:49:11  profilanswer
 

benou a écrit :

bon ...
 
1) tu avais di que c'était un tableau de int qui était utilisé comme clef&valeur. Maintenant tu me dis que c'est un objet qui contient le tableau ... ca fait déjà une grosse différence ...


 
en fait ça ressemble à ça :
 

Code :
  1. class SubSet
  2. {
  3.   private int[] tableau;
  4.   public SubSet (int[] un_tableau)
  5.   {
  6.     tableau = un_tableau;
  7.   }
  8.  
  9.   //surcharge de la méthode equals pour des objets SubSet
  10.   public boolean equals (Object obj)
  11.   {
  12.     SubSet subSet = (SubSet) obj;
  13.     for (int i = 0; i < tableau.length; i++)
  14.       if (tableau[i] != subSet.tableau[i])
  15.         return false;
  16.     return true;
  17.   }
  18.   //calcul du hashCode d'un objet SubSet
  19.   //la méthode toString converti le tableau en String
  20.   public int hashCode ()
  21.   {
  22.     return tableau.toString ().hashCode ();
  23.   }


 
puis le petit main qui va bien avec :

Code :
  1. public static void main ()
  2. {
  3.   int[] tableau = new int[100];
  4.   //après initialisation du tableau avec des valeurs quelconques
  5.   SubSet subSet = new SubSet (tableau);
  6.   //cherche si le SubSet est présent
  7.   if (table_de_hash.get (subSet) == null)
  8.   {
  9.     table_de_hash.put (subSet, subSet);
  10.   }
  11. }


 
alors dans le cas ci-dessus, c'est bien une référence (ici subSet) qui contient pointe sur un objet SubSet et donc indirectement sur le tableau. Donc que je prenne pour clé/valeur la variable "subSet" ou bien directement la variable "tableau" (dans le main()), je ne pense pas que ca change grand chose. Schématiquement ce serait :
 
- Dans le cas où le tableau est contenu par l'objet subSet :
 
subSet->tableau->int[];
 
- Dans le cas où le tableau est contenu par rien du tout, si n'est seulement par la référence sur le tableau :
 
tableau->int[];
 
Les flèches sont à traduire par "pointe sur". Dans ce shéma, on voit bien que si je hash "subSet" ou bien "tableau", ça change pas grand chose : dans les 2 cas mon tableau de int[] reste en mémoire.
 
 

benou a écrit :


2) je compend rien à ton histoire de de "être supprimé de la mémoire" ou "nécessité de convertir en String" .  


 
Ben le garbage collector supprime un objet de la mémoire à partir du moment où il est sûr que l'objet ne pourra pas être utilisé. Autrement dit, si je garde toujours une référence sur mon tableau de 100 int (variable "tableau" de la classe SubSet qui pointe dessus) il est certain que l'objet ne sera jamais détruit (= supprimé de la mémoire).
Donc si je mets 100 clés dans ma table de hash je mets donc indirectement 100 tableaux de 100 int ce qui commence vite a saturer la mémoire.
Par conséquent, si je convertis en String le tableau de 100 int, ensuite je récupère le hashCode de cette String, je prendrai pour clé/valeur le hashCode de cette String qui dépend indirectement de mon tableau de 100 int. Donc si a partir de la je mets 100 clés dans ma table de hash, je mets donc indirectement 100 int (100 hashCode de String) ce qui est nettement moins gourmand en mémoire.
Par contre dans ce cas le problème est de toujours convertir le tableau de 100 int en String avant d'insérer dans la table de hash (perte de temps).
 

benou a écrit :


3) Pour ton histoire de perf le fait de le transformer en String ne serts absolument à rien. Dans les cas où un hashCode est long à calculer, il suffit de faire du cache : la première fois tu le calcul et tu sauve sa valeur, et les fois suivantes tu retourne la valeur déjà calculée. C'est d'ailleur ce qui est fait dans l'objet String si tu regardes son code source.


 
Ton système de cache est pas bête du tout.  :jap: Mais dans mon cas je n'ai qu'un tableau de 100 int, je ne peux rien mettre en cache :/
 

benou a écrit :


4) pour ton histoire de proba, on s'en fout : D'abord parce que l'algo a certainement été choisit justement pour que cette proba soit faible. Et ensuite parce que c'est pas parce que pour 2 objets différents on a le même hashcode que c'est un problême ! D'autant plus que d'ans l'algorythme de hachage, le hasCode est toujours modulé => les hashCode modulés sont très souvent égaux pour des objets différents


 
Ben moi je ne m'en fou pas tant que ça car si j'ai 2 String différentes et donc que j'ai indirectement 2 tableaux de 100 int différents; admettons que j'ai le même hashCode de ces 2 String :
lorsque je fais le code suivant :

Code :
  1. //a un moment quelconque du code, je fais les instructions suivantes :
  2. int[] tableau = ...//affectation a tableau d'un tableau récupéré de je ne sais où...
  3. SubSet subSet = new SubSet (tableau);
  4. //je récupere le hashCode de la String correspondante
  5. int un_entier = subSet.hashCode ();
  6. //dans le test ci-dessous, ca peut merder :/ car si la valeur entière
  7. //hashée existe déjà, je considère quoi ? que la String, indirectement
  8. //le tableau de 100 int existe deja ou bien que non en fait elle
  9. //n'existe pas mais c'est que le hashCode de cette String, et donc  
  10. //indirectement le tableau de 100 int, est le même
  11. //que le hashCode d'une ancienne AUTRE String, et donc indirectement un  
  12. //AUTRE tableau de 100 int différent, que j'avais hashée  
  13. //auparavant. ??
  14. if (table_de_hash.get (un_entier) == null)
  15. {
  16. ...
  17. }
  18. }


 
J'espère avoir été plus clair  :)

n°835614
benou
Posté le 29-08-2004 à 17:46:17  profilanswer
 

C'est n'importe quoi ta méthode hashcode ! T'as déjà vu à quoi ca ressemblait le toString d'un tableau de int ?
avec l'implémentation que tu as faite, la règle liant equals et hashcode n'est pas respectée => ca va donner n'importe quoi ta Map.
 

Giz a écrit :

alors dans le cas ci-dessus, c'est bien une référence (ici subSet) qui contient pointe sur un objet SubSet et donc indirectement sur le tableau. Donc que je prenne pour clé/valeur la variable "subSet" ou bien directement la variable "tableau" (dans le main()), je ne pense pas que ca change grand chose.  


ben si ca change tout puisque equals et hascode ne sont pas calculés de la même façon
 

Giz a écrit :

Les flèches sont à traduire par "pointe sur". Dans ce shéma, on voit bien que si je hash "subSet" ou bien "tableau", ça change pas grand chose : dans les 2 cas mon tableau de int[] reste en mémoire.


bha bien sur qu'il reste en mémore. Où tu voudrais qu'il aille ?  [:mlc2]  
 

Giz a écrit :


Ben le garbage collector supprime un objet de la mémoire à partir du moment où il est sûr que l'objet ne pourra pas être utilisé. Autrement dit, si je garde toujours une référence sur mon tableau de 100 int (variable "tableau" de la classe SubSet qui pointe dessus) il est certain que l'objet ne sera jamais détruit (= supprimé de la mémoire).  
Donc si je mets 100 clés dans ma table de hash je mets donc indirectement 100 tableaux de 100 int ce qui commence vite a saturer la mémoire.  
Par conséquent, si je convertis en String le tableau de 100 int, ensuite je récupère le hashCode de cette String, je prendrai pour clé/valeur le hashCode de cette String qui dépend indirectement de mon tableau de 100 int. Donc si a partir de la je mets 100 clés dans ma table de hash, je mets donc indirectement 100 int (100 hashCode de String) ce qui est nettement moins gourmand en mémoire.  
Par contre dans ce cas le problème est de toujours convertir le tableau de 100 int en String avant d'insérer dans la table de hash (perte de temps).


mais [:le kneu]
 
De quoi tu parles là ??? En quoi calculer le hashcode à partir d'une version String de ton tableau va te faire économiser de la mémoire ? De toute façon ton tableau sera toujours dans la map au final donc tu ne gagne rien ! Je vois vraiment pas où tu veux en venir ...
En plus, pkoi ta String prendrait moins de place que le tableau de int qu'elle représente. Ca risque d'être vrai pour les petits entiers, mais dès qu'ils sertont plus grand ca le sera plus du tout, au contraire !
 

Giz a écrit :


Ton système de cache est pas bête du tout.   Mais dans mon cas je n'ai qu'un tableau de 100 int, je ne peux rien mettre en cache


ben si : le hachcode que tu aura calculé à partir de ton tableau de int. Mai sà mon avis, t'as rien compris à ce qu'était le hashcode ...
 

Giz a écrit :


J'espère avoir été plus clair  


oui t'as été clair : t'as rien compris au fonctionnement de l'algo de hashage. relis le début du thread, j'explique comment ca marche.


Message édité par benou le 29-08-2004 à 17:47:22

---------------
ma vie, mon oeuvre - HomePlayer
n°835652
Giz
Posté le 29-08-2004 à 18:36:05  profilanswer
 

benou a écrit :

C'est n'importe quoi ta méthode hashcode ! T'as déjà vu à quoi ca ressemblait le toString d'un tableau de int ?
avec l'implémentation que tu as faite, la règle liant equals et hashcode n'est pas respectée => ca va donner n'importe quoi ta Map.


 
[:plusun]
 
Pour ma méthode toString, par exemple pour le tableau 01234, ca me renvoie simplement la chaîne "01234" c'est tout.
Pour la règle liant equals et hashCode, je me suis complètement déchiré  [:kc]. C'est un mélange de mon vieux code et du nouveau  :pt1cable: . Bref, oublie la class SubSet finalement :D.
Je calcule donc juste, avant de regarder dans la table de hash, le hashCode du tableau de 100 int via la méthode toString ().
 

benou a écrit :


ben si ca change tout puisque equals et hascode ne sont pas calculés de la même façon


 
Bon, on va oublié la class SubSet, c'était une connerie :D
 
 

benou a écrit :


mais [:le kneu]
 
De quoi tu parles là ??? En quoi calculer le hashcode à partir d'une version String de ton tableau va te faire économiser de la mémoire ? De toute façon ton tableau sera toujours dans la map au final donc tu ne gagne rien ! Je vois vraiment pas où tu veux en venir ...
En plus, pkoi ta String prendrait moins de place que le tableau de int qu'elle représente. Ca risque d'être vrai pour les petits entiers, mais dès qu'ils sertont plus grand ca le sera plus du tout, au contraire !


 
En fait, mes tableaux de 100 int sont générés aléatoirement (bon je simplifie c'est un peu plus subtile). Je convertis juste ca en String, calcule le hashCode, regarde s'il est le même (même si dans l'absolu ca peut etre 2 String différentes). Si ce hashCode est deja dans la table, je considère que ce tableau de 100 int est présent (auquel cas je ne vais pas plus loin dans l'algo). S'il n'est pas présent, j'ajoute le hashCode dans la table de hash (en faisant une ou 2 instructions en plus)
 

benou a écrit :


ben si : le hachcode que tu aura calculé à partir de ton tableau de int. Mai sà mon avis, t'as rien compris à ce qu'était le hashcode ...


 
Comme mes tableaux sont générés "aléatoirement", je ne peux rien mettre en cache car j'ai un ENORME nombre de permutations possible (100! pour un tableau de 100 int).
 

benou a écrit :


oui t'as été clair : t'as rien compris au fonctionnement de l'algo de hashage. relis le début du thread, j'explique comment ca marche.


 
Ben en fait, j'ai bien compris, c'est juste que je ne m'été pas relus  [:ke-c] . Effectivement la class SubSet était débile. En fait comme je n'utilise plus qu'un int (le hashCode de la String comme clé/valeur),
je fais :
table_de_hash.put (new integer (hashCode)).
Voilà, et là, la méthode equals est bonne ;)


Message édité par Giz le 29-08-2004 à 19:03:22
n°835666
benou
Posté le 29-08-2004 à 19:01:18  profilanswer
 

je laisse tomber ...
 
et j'ai moi :

class Test {
   public static void main (String[] args) {
      int[] t = {1, 2, 3};
      System.out.println(t);
   }    
}


ca donne

[I@107077e


---------------
ma vie, mon oeuvre - HomePlayer
n°835671
Giz
Posté le 29-08-2004 à 19:07:23  profilanswer
 

benou a écrit :

je laisse tomber ...
 
et j'ai moi :

class Test {
   public static void main (String[] args) {
      int[] t = {1, 2, 3};
      System.out.println(t);
   }    
}


ca donne

[I@107077e



 
ma méthode toString est toute conne : en gros :
 

Code :
  1. String string = new String ()
  2. string = "";
  3. for (int i = 0; i < 100; i++)
  4.   string += tableau[i];
  5. return string;


n°835698
benou
Posté le 29-08-2004 à 19:54:47  profilanswer
 

Giz a écrit :

ma méthode toString est toute conne : en gros :
 

Code :
  1. String string = new String ()
  2. string = "";
  3. for (int i = 0; i < 100; i++)
  4.   string += tableau[i];
  5. return string;



c'est pas le code que t'as donné tout à l'heure ...
 
mais même : construire une chaine juste pour pas se faire un hashage soi même c'est nul ...


---------------
ma vie, mon oeuvre - HomePlayer
n°835874
Giz
Posté le 29-08-2004 à 22:47:06  profilanswer
 

benou a écrit :

c'est pas le code que t'as donné tout à l'heure ...
 
mais même : construire une chaine juste pour pas se faire un hashage soi même c'est nul ...


 
Ben la méthode toString (), je ne l'avais jamais donnée  [:wam]  
Sinon ben pour le hashCode, je vois pas ce que je peux prendre d'autre pour un tableau de 100 int  [:mlc2] ... sachant que mes tableaux sont TOUS identiques à part l'emplacement des entiers qui diffèrent. Si tu vois autre chose, mais je doute...
par exemple 2 tableaux différents : 1234 et 4231 => seuls les emplacements des int diffèrent.

n°835882
veryfree
Posté le 29-08-2004 à 22:55:58  profilanswer
 

jcrois qu il est temps de laché l'affaire la [:veryfree]

n°835956
Giz
Posté le 29-08-2004 à 23:36:04  profilanswer
 

veryfree a écrit :

jcrois qu il est temps de laché l'affaire la [:veryfree]


 
ben si tu as une autre solution je suis preneur  [:spamafote]

n°835960
benou
Posté le 29-08-2004 à 23:38:12  profilanswer
 

Giz a écrit :


par exemple 2 tableaux différents : 1234 et 4231 => seuls les emplacements des int diffèrent.


exemple :  
int sum = 0;
for (int i=0; i < tab.length; i++) {
   sum = sum * 23 + tab[i];
}
 
mais ca peut être n'importe quoi d'autre qui s'appuie en gros sur l'ordre de tes int ...
 
et non t'avais pas donné la méthode toString mais tu avais marqué tableau.toString(), ce qui laisse supposer que tu appelais la méthode toString() de base pour les objets tableaux  :sleep:.


---------------
ma vie, mon oeuvre - HomePlayer
n°836011
Giz
Posté le 29-08-2004 à 23:59:44  profilanswer
 

benou a écrit :

exemple :  
int sum = 0;
for (int i=0; i < tab.length; i++) {
   sum = sum * 23 + tab[i];
}


 
oui c'est vrai. Maintenant est-ce vraiment plus performant ?...sachant que je veux que la proba que deux tableaux différents aient le même hashCode soit faible ;). Si c'est juste pour éviter un parcours de tableau, alors par rapport à mon prog, le temps perdu est négligeable ;)
Sinon, perso, j'essaie d'utiliser les fonctions de la bibliothèque autant que possible (si ce n'est pas pénalisant bien sûr ;))
 
 

benou a écrit :


et non t'avais pas donné la méthode toString mais tu avais marqué tableau.toString(), ce qui laisse supposer que tu appelais la méthode toString() de base pour les objets tableaux  :sleep:.


 
Désolé pour la confusion alors  :jap: mais c'est bien une implémentation perso ;)

n°836101
benou
Posté le 30-08-2004 à 08:25:37  profilanswer
 

Giz a écrit :

oui c'est vrai. Maintenant est-ce vraiment plus performant ?...sachant que je veux que la proba que deux tableaux différents aient le même hashCode soit faible ;). Si c'est juste pour éviter un parcours de tableau, alors par rapport à mon prog, le temps perdu est négligeable ;)
Sinon, perso, j'essaie d'utiliser les fonctions de la bibliothèque autant que possible (si ce n'est pas pénalisant bien sûr ;))


bien sûr que c'est plus performant !  
compare les traitements effectués, c'est évident !
 
Au fait, j'avais pas bien regardé ta méthode toString ... C'est une catastrophe niveau perf !!


---------------
ma vie, mon oeuvre - HomePlayer
n°836836
Giz
Posté le 30-08-2004 à 17:01:49  profilanswer
 

benou a écrit :

bien sûr que c'est plus performant !  
compare les traitements effectués, c'est évident !
 
Au fait, j'avais pas bien regardé ta méthode toString ... C'est une catastrophe niveau perf !!


 
et tu proposerais quoi comme algo pour convertir le tableau en String ?  :heink:


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
n°836851
benou
Posté le 30-08-2004 à 17:09:06  profilanswer
 

Giz a écrit :

et tu proposerais quoi comme algo pour convertir le tableau en String ?  :heink:


1) je transformerais pas le tableau en String.
2) j'utiliserais un StringBuffer
3) je séparerais les int, parec que là {12,1}, {1, 21} et {1, 2, 1} sont transformés de la même façon


Message édité par benou le 30-08-2004 à 17:10:01

---------------
ma vie, mon oeuvre - HomePlayer
n°836961
Giz
Posté le 30-08-2004 à 18:37:30  profilanswer
 

benou a écrit :

1) je transformerais pas le tableau en String.
2) j'utiliserais un StringBuffer
3) je séparerais les int, parec que là {12,1}, {1, 21} et {1, 2, 1} sont transformés de la même façon


 
1) le StringBuffer permettrait de stocker une seule fois tous mes entiers si j'ai bien compris. Mais pour passer d'une permutation à une autre et ainsi générer un nouveau hashCode, tu t'y prendrais comment ?...tu vas lire ton StringBuffer caractère pas caractère ?  :heink:  
 
2) Ensuite la classe StringBuffer n'a pas de méthode hashCode () d'implémenter, dans ce cas, il faudrait utiliser la tienne.
 
 
Bon maintenant que j'ai le net sur mon pc sur lequel je travaille, voilà le vrai code utilisé, de la méthode toString (), dans le programe (il est ressemblant) :

Code :
  1. //mChain est le tableau d'int
  2. public String toString()
  3. {
  4.         String s = new String();
  5.         s=s+"[";
  6.         for (int i=0;i<size-1;i++){
  7.             s = s + mChain[i]+", ";             
  8.         }       
  9.         s = s + mChain[size-1]+"]";
  10.         return s;
  11. }


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
n°836990
benou
Posté le 30-08-2004 à 19:00:24  profilanswer
 

1) non t'as rien compris. StringBuffer permet juste de construire des chaines (par concaténation) de façon beaucoup plus efficaces que le +=
 
2) Ensuite, t'es pénible à voiloir appeler hashCode sur n'importe quoi. Je t'ai déjà dit que c'était pas la bonne solution de construire une chaine. Pourquoi tu t'obstines ?
 
et puis merde en fait ... j'arrête pas d'essayer de te guider dans la bonne direction et toi tu t'obstines...
 
Je te laisse donc te débrouiller avec tes String et tes hashcodes. Bon courage !


---------------
ma vie, mon oeuvre - HomePlayer
n°837001
nraynaud
lol
Posté le 30-08-2004 à 19:26:51  profilanswer
 

Giz a écrit :


Code :
  1. s = s + mChain[i]+", ";




Citation :

- n'utilisez pas += pour rallonger une chaîne.


 
Les dessous des Strings

n°837031
Giz
Posté le 30-08-2004 à 19:44:36  profilanswer
 

c'est bien intéressant ce que vous dîtes. Mais bon, moi qui débarque dans le Java, y'a rien de spécifier dans la doc. Je ne risque pas de savoir ce que benou a dit. La seul doc que j'utilise est la classique description de la librairie qui me sert :
 
http://java.sun.com/j2se/1.5.0/docs/api/index.html
 
Alors dire que je m'obstine c'est un peu facile quand je ne suis pas un javateux ésotérique. Les dessous de Java j'ai pas le temps de l'étudier en long en large et en travers (si faudrait faire ça pour tout les langages ca serait la mort).  :sarcastic: .
S'il y aurait tant de différence au niveau perf. la javadoc le preciserai il me semble.  
Bon maintenant je vais aller voir le lien de nraynaud  [:icon10] .
 
et nraynaud > quand je lis la javadoc il est écrit noir sur blanc :


The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings


 
Alors, ben puisque ils le spécifient, je l'utilise.


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
n°837038
nraynaud
lol
Posté le 30-08-2004 à 19:54:26  profilanswer
 

Giz a écrit :


et nraynaud > quand je lis la javadoc il est écrit noir sur blanc :


The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings


 
Alors, ben puisque ils le spécifient, je l'utilise.

1) tu es assez con pour croire la javadoc sur un point du langage, chapeau (cepandant, cette affirmation est vraie)
2) tu es trop con tout court.
 
Tu as interdiction de faire la moindre remarque sur les performances de java.  
 
J'espère que tu es au chomedu et que tu y restera ou que tu te fera virer pour incompétence rapidement.
 
 
Quand je pense à ce genre de réponse qui montre qu'on a absolument rien compris aux fondements de l'info et que moi on me propose d'aller faire des interfaces web dans une mutuelle, il y a vraiment quelquechose de pourri.
 
Tu es une merde.

n°837048
benou
Posté le 30-08-2004 à 19:59:56  profilanswer
 

Giz a écrit :

c'est bien intéressant ce que vous dîtes. Mais bon, moi qui débarque dans le Java, y'a rien de spécifier dans la doc. Je ne risque pas de savoir ce que benou a dit.


ben alors pourquoi tu m'écoutes pas quand je te dis quelque chose ?
et la javadoc c'est une documentation sur l'API java, pas sur tout le langage.


---------------
ma vie, mon oeuvre - HomePlayer
n°837061
Giz
Posté le 30-08-2004 à 20:17:43  profilanswer
 

benou a écrit :

ben alors pourquoi tu m'écoutes pas quand je te dis quelque chose ?
et la javadoc c'est une documentation sur l'API java, pas sur tout le langage.


 
c'est pas que je veux pas t'écouter mais les affirmations du style :
 


1) je transformerais pas le tableau en String.  
2) j'utiliserais un StringBuffer


 
Ca m'apporte pas grand chose  :sarcastic:


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
n°837075
benou
Posté le 30-08-2004 à 20:27:45  profilanswer
 

Giz a écrit :

Ca m'apporte pas grand chose  :sarcastic:


Je t'ai dis qu'il fallait pas passer par une String pour faire ton hashCode et qu'il fallait le calculer toi même à partir de ton tableau. C'est bon là c'est clair ???? je te dis ca depuis hier bon sang ! qu'est ce qu'il te faut ??? je t'ai même filé un exemple d'algo !
 
Je veux bien aider mais faut faire un minimum d'effort quand même, merde !


---------------
ma vie, mon oeuvre - HomePlayer
n°837099
Giz
Posté le 30-08-2004 à 20:57:39  profilanswer
 

nraynaud a écrit :

1) tu es assez con pour croire la javadoc sur un point du langage, chapeau (cepandant, cette affirmation est vraie)
2) tu es trop con tout court.
 
Tu as interdiction de faire la moindre remarque sur les performances de java.  
 
J'espère que tu es au chomedu et que tu y restera ou que tu te fera virer pour incompétence rapidement.
 
 
Quand je pense à ce genre de réponse qui montre qu'on a absolument rien compris aux fondements de l'info et que moi on me propose d'aller faire des interfaces web dans une mutuelle, il y a vraiment quelquechose de pourri.
 
Tu es une merde.


 
Houlala, j'ai vexé le javateux là  , mdr ! :lol:  
Sinon, ce n'était même pas moi qui a fait cette fonction, je ne fais que poursuivre le développement  :na:  
Si on t'envoie faire des interfaces web dans une mutuelle c'est que t'es incompétent pour le reste peut être :lol: (sauf pour java  :love: )
 
EDIT : et j'espère que tu travailleras beaucoup pour financer mon chômage  :D
 
EDIT 2 : tu mérites une sanction :D


Il serait bon de rester courtoi.  
 c'est-à-dire éviter les insultes non justifiées et répétées envers autrui. Un avertissement sera donné et, si récidive, un sanction. La provocations des modérateurs aura le même effet.


Message édité par Giz le 30-08-2004 à 21:08:26

---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
n°837163
nraynaud
lol
Posté le 30-08-2004 à 22:31:13  profilanswer
 

Giz a écrit :

sauf pour java

c'est ça ouais, genre je suis soupçonnable d'âtre mono-langage ou mono-domaine ...
 

Giz a écrit :

EDIT 2 : tu mérites une sanction :D


Il serait bon de rester courtoi.  
 c'est-à-dire éviter les insultes non justifiées et répétées



elle est amplement justifiée et non-encore répétée.

n°837186
Giz
Posté le 30-08-2004 à 23:08:09  profilanswer
 

nraynaud a écrit :

c'est ça ouais, genre je suis soupçonnable d'âtre mono-langage ou mono-domaine ...
 
elle est amplement justifiée et non-encore répétée.


 
tu n'as qu'à insulter tout le monde de bon à rien aussi, et ça sera toujours justifié... :pfff: . Et puis le "justifié" c'est subjectif ce truc, hein, ça veut rien dire.
 
PS : sinon, j'ai testé les "StringBuffer.append ()" contre les "String +=", bon y'a pas photo niveau perf :D. Mais bon, pour mon tableau de 100 int, on voit pas de différence.


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
n°837234
nraynaud
lol
Posté le 30-08-2004 à 23:43:56  profilanswer
 

Giz a écrit :

tu n'as qu'à insulter tout le monde de bon à rien aussi, et ça sera toujours justifié... :pfff:

non, TU es un boolay, ce qui n'est pas le cas de tout le monde ici.  
 
Et tu es un boolay non pas parce que tu débutes, mais bien parce que tu conteste ce que te disent des gens largement expérimenté dans le domaine que tu abordes, et que tu ne fais la différence entre "ça existe" (le + pour les chaines) et "il faut l'utiliser tout le temps" (ce qui n'est absolument pas le cas pour +, il faut l'utiliser avec prudence).
 
quand Benou te dit un truc sur la complexité de hashCode ou toString(), il a largement raison. Il a passé du temps à pondre et commenter des pavés, et tu n'écoutes toujours pas ses conseils avisés. Il est pourtant pas en train de te parler de collaborations complexes entre objets, mais bêtement des fonctions de Object, qui répondent aux besoins les plus basiques de java.
 
quand benou te propose (fort à-propos) un générateur congruant pour générer tes hash, tu lui réponds (à peu près) que générer le toString() puis faire le hashCode (qui est aussi un générateur congruant) de la chaine est plus rapide ... Si tu comprends rien à la complexité et aux performances, écoute-le, il connait lui ! Je prends la discussion en cours, je vois des concaténations douteuses (que Benou avait déjà soulignées d'ailleur), je file un topic que j'avais fait sur le sujet, lis-le pose des questions sur l'articulation de totu ça, mais ne vient pas sortir un bout de javadoc hors-contexte.

n°837266
Giz
Posté le 31-08-2004 à 00:17:43  profilanswer
 

nraynaud a écrit :

non, TU es un boolay, ce qui n'est pas le cas de tout le monde ici.  
 
Et tu es un boolay non pas parce que tu débutes, mais bien parce que tu conteste ce que te disent des gens largement expérimenté dans le domaine que tu abordes, et que tu ne fais la différence entre "ça existe" (le + pour les chaines) et "il faut l'utiliser tout le temps" (ce qui n'est absolument pas le cas pour +, il faut l'utiliser avec prudence).
 
quand Benou te dit un truc sur la complexité de hashCode ou toString(), il a largement raison. Il a passé du temps à pondre et commenter des pavés, et tu n'écoutes toujours pas ses conseils avisés. Il est pourtant pas en train de te parler de collaborations complexes entre objets, mais bêtement des fonctions de Object, qui répondent aux besoins les plus basiques de java.
 
quand benou te propose (fort à-propos) un générateur congruant pour générer tes hash, tu lui réponds (à peu près) que générer le toString() puis faire le hashCode (qui est aussi un générateur congruant) de la chaine est plus rapide ... Si tu comprends rien à la complexité et aux performances, écoute-le, il connait lui ! Je prends la discussion en cours, je vois des concaténations douteuses (que Benou avait déjà soulignées d'ailleur), je file un topic que j'avais fait sur le sujet, lis-le pose des questions sur l'articulation de totu ça, mais ne vient pas sortir un bout de javadoc hors-contexte.


 

Giz a écrit :


oui c'est vrai. Maintenant est-ce vraiment plus performant ?...sachant que je veux que la proba que deux tableaux différents aient le même hashCode soit faible . Si c'est juste pour éviter un parcours de tableau, alors par rapport à mon prog, le temps perdu est négligeable  
Sinon, perso, j'essaie d'utiliser les fonctions de la bibliothèque autant que possible (si ce n'est pas pénalisant bien sûr


 
J'en conclus que tu ne comprends pas le français ? ou que tu es con ? ... ou les 2 ? :D


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5

Aller à :
Ajouter une réponse
 

Sujets relatifs
question de newbie : a quoi sert la fonction break?[HTML, JS] Heu, ca sert à quoi le HTML 4.01, à part renvoyer aux CSS2
[XML] SVG : qui s'en sert ?A quoi sert ma BdD localhost si j'en ai une sur Multimania?
[mysql]a koi sert l'attribut binary des chps mysql ?[VB] A quoi sert ....
[PHP] disk_total_space : undefined function... quelqu'un s'en sert ?Trouver une bonne formule de HashCode
a koi sert le fichier MSCVRT.DLL ki se trouve dans system32?a quoi sert une base de donnee pour un site
Plus de sujets relatifs à : hashCode, qui s'en sert ?


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