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

 


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

hashCode, qui s'en sert ?

n°688153
El_gringo
Posté le 31-03-2004 à 10:36:45  profilanswer
 

Reprise du message précédent :

nraynaud a écrit :

C'est même normal.


 
Ben... si c'est évitable, autant l'éviter non ?  
Genre dans le cas d'un objet dont l'identité est fixée par un entier, ou 2 short, ...

mood
Publicité
Posté le 31-03-2004 à 10:36:45  profilanswer
 

n°688158
nraynaud
lol
Posté le 31-03-2004 à 10:39:39  profilanswer
 

el_gringo a écrit :

Ben... si c'est évitable, autant l'éviter non ?  
Genre dans le cas d'un objet dont l'identité est fixée par un entier, ou 2 short, ...

oué, mais pour des raisons techniques, c'est exceptionnel.


---------------
trainoo.com, c'est fini
n°688160
bobuse
Posté le 31-03-2004 à 10:40:22  profilanswer
 

moi, ça m'a déjà posé des soucis, un hashcode mal généré, qui me faisait de doublons :/
Mais je me souviens plus pourquoi :D

n°688164
El_gringo
Posté le 31-03-2004 à 10:41:42  profilanswer
 

nraynaud a écrit :

oué, mais pour des raisons techniques, c'est exceptionnel.


 
Je m'en doute.

n°688165
El_gringo
Posté le 31-03-2004 à 10:42:54  profilanswer
 

bobuse a écrit :

moi, ça m'a déjà posé des soucis, un hashcode mal généré, qui me faisait de doublons :/
Mais je me souviens plus pourquoi :D


 
quand tu parles de "doublons", t'évoques le cas que je viens de décrire ?
Parce que, ce cas, ça signifie pas que le hashcode est "mal géré". Comme le dit Raynaud, c'est un cas normal. souvent inévitable.

n°688169
nraynaud
lol
Posté le 31-03-2004 à 10:46:31  profilanswer
 

bobuse a écrit :

moi, ça m'a déjà posé des soucis, un hashcode mal généré, qui me faisait de doublons :/
Mais je me souviens plus pourquoi :D

genre tu t'es chié dessus pour le equals() ? Ou plus pervers : le compareTo().


---------------
trainoo.com, c'est fini
n°688173
bobuse
Posté le 31-03-2004 à 10:52:54  profilanswer
 

equals()
 
de mémoire, c'était pour un agenda foireux, et quand j'ajoutais un événement à un jour, ça l'ajoutait à plusieurs ... m'enfin c'est loin tout ça :D ! J'en suis plus à coder des agendas :D

n°688184
El_gringo
Posté le 31-03-2004 à 11:09:47  profilanswer
 

bobuse a écrit :

equals()
 
de mémoire, c'était pour un agenda foireux, et quand j'ajoutais un événement à un jour, ça l'ajoutait à plusieurs ... m'enfin c'est loin tout ça :D ! J'en suis plus à coder des agendas :D


 
foireux les agendas en plus ! :D

n°688750
veryfree
Posté le 31-03-2004 à 17:52:55  profilanswer
 


[:prosterne]benou[:prosterne2]


Message édité par veryfree le 31-03-2004 à 18:04:33
n°688825
the real m​oins moins
Posté le 31-03-2004 à 18:51:49  profilanswer
 

[:mlc]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
mood
Publicité
Posté le 31-03-2004 à 18:51:49  profilanswer
 

n°688837
veryfree
Posté le 31-03-2004 à 19:02:17  profilanswer
 


 
a la base j'avait cité un tres long post de la premiere page et je me suis dit que ca servait a rien de quoté alors j'ai edité  :kaola:  
 
 
 
 
 

n°689074
benou
Posté le 31-03-2004 à 22:41:32  profilanswer
 

C'est vieux tout ca :)

n°760312
Jubijub
Parce que je le VD bien
Posté le 11-06-2004 à 12:28:49  profilanswer
 

si g bien tout compris, un bon hash est un hash qui pour 2 objets différents mais avec des attributs identiques renvoit un hash identique, et qui pour des objets différents, renvoit 2 hashs les plus distincts possible...
 
et là dessus, il faut que le equals soit cohérent avec ce bordel...


---------------
Jubi Photos : Flickr - 500px
n°784675
El_gringo
Posté le 02-07-2004 à 12:01:48  profilanswer
 

Via IntelliJ, je peux générer automatiquement des méthodes "equals" et "hashcode". Pour cela, je choisi simplement les attributs à inclure dans la détermination d'égalité, et celle du hashcode.
Mais, quelqu'un saurait m'expliquer le résultat, en ce qui concerne le hashcode ? :

Code :
  1. public int hashCode () {
  2.         int result;
  3.         result = getName().hashCode ();
  4.         result = 29 * result + getTitle().hashCode ();
  5.         result = 29 * result + getHelp().hashCode ();
  6.         result = 29 * result + (m_objMap != null ? m_objMap.hashCode () : 0);
  7.         return result;
  8.     }


 
pourquoi 29 ?

n°785052
Jubijub
Parce que je le VD bien
Posté le 02-07-2004 à 15:41:41  profilanswer
 

si j'en crois ce qui a été expliqué, ca doit être pour étendre la plage de hash disponible...c une constante à la con, tu peux mettre n'importe quoi à la place


---------------
Jubi Photos : Flickr - 500px
n°785062
nraynaud
lol
Posté le 02-07-2004 à 15:48:14  profilanswer
 

El_gringo a écrit :

pourquoi 29 ?

parce que c'est premier.


---------------
trainoo.com, c'est fini
n°785105
gfive
Posté le 02-07-2004 à 16:13:33  profilanswer
 

nraynaud a écrit :

parce que c'est premier.


 
Mais pkoi pas 7, ou 5 ou 13, alors? Il doit y avoir un matheux méga balaise qui a calculé que 29 était un bon compromis, je suis sûr.

n°785108
nraynaud
lol
Posté le 02-07-2004 à 16:16:25  profilanswer
 

gfive a écrit :

Il doit y avoir un matheux méga balaise qui a calculé que 29 était un bon compromis, je suis sûr.

avant de dire ça, va regarder comment le re-hachage de la classe HashMap a été conçu, tout n'est pas exactement aussi carré ...


---------------
trainoo.com, c'est fini
n°785111
gfive
Posté le 02-07-2004 à 16:18:29  profilanswer
 

nraynaud a écrit :

avant de dire ça, va regarder comment le re-hachage de la classe HashMap a été conçu, tout n'est pas exactement aussi carré ...


 
Ah, ça, je sais pas, sans doute! :)  
 
Mais j'ai tendance à penser qu'il doit y avoir une explication de la mort qui tue qui fait que 29 est plus judicieux que 13, et que 101, par exemple. Et que même avec le niveau de math que j'avais en prépa, j'y pigerai pas grand chose! :)

n°785139
El_gringo
Posté le 02-07-2004 à 16:40:18  profilanswer
 

nraynaud a écrit :

parce que c'est premier.


 
Donc toi tu dirais qu'ils mettent 29, comme ils auraient pu mettre n'importe quel autre nombre 1er ?

n°793476
Giz
Posté le 12-07-2004 à 12:37:13  profilanswer
 

benou a écrit :

bha oui. Le problème c'est pas hashcode c'est equals !
 
il va forcément falloir que tu redéfinnisse equals. Sinon ton objet sera "faux" et tu auras des problèmes quand tu voudra rendre tes objets perssistants (sérialisation, bdd) ou distribués. C'est à dire quand tu pourras avoir un objet identique (égaux) avec 2 adresses mémoires différentes.
 
Et une fois que le equals est redéfini, tu es obligé de redéfinir le hashcode si tu veux t'en servir dans une Map (ou tout autre objet qui utilise la méthode hashcode) sinon le principe du "2 objets égaux ont le même hascode" devient faux. Et là ca va te faire des bugs durs à trouver !


 
 
 
Je ne comprends pas pourquoi si on defini la methode equals, on DOIT aussi definir la methode hashCode !
le methode equals, OK ca c neccessaire pour comparer deux objets. Cependant c 2 objets egaux ou non entre eux ont une adresse memoire differente ! (si non alors c le meme objet dc les cle st forcement egales)
Par consequent le hashage des 2 objets (via leur adresse) donne deja un hashCode different ! pourquoi le redefinir OBLIGATOIREMENT alors ?
 
Franchement, la necessite de redefinir la methode hashCode (), je ne vois pas trop. J'aimerais bien que tu me donnes un cas precis, ou il s'avere utile de la redefinir.
 
Sinon, j'ai fais ce que tu as dis dans un programme, (redefinir equals et hashCode) et mon programme ne marche pas pour autant :/
(cf topic : http://forum.hardware.fr/hardwaref [...] 748-1.htm)
 
Merci de ton aide :jap


Message édité par Giz le 12-07-2004 à 12:38:09
n°793539
Jubijub
Parce que je le VD bien
Posté le 12-07-2004 à 13:54:19  profilanswer
 

ben ca dépend quel sens tu donnes à l'égalité...
 
par ex dans mon appli je considère 2 objets égaux si ils ont le même identifiant (un champ String)...
 
le hashcode renverra forcément des trucs différents pour 2 objets, qui pourtant seront égaux selon mon acceptation...donc je dois redéfinir hashcode aussi

n°793556
nraynaud
lol
Posté le 12-07-2004 à 14:15:49  profilanswer
 

Giz a écrit :

Je ne comprends pas pourquoi si on defini la methode equals, on DOIT aussi definir la methode hashCode !
le methode equals, OK ca c neccessaire pour comparer deux objets. Cependant c 2 objets egaux ou non entre eux ont une adresse memoire differente ! (si non alors c le meme objet dc les cle st forcement egales)
Par consequent le hashage des 2 objets (via leur adresse) donne deja un hashCode different ! pourquoi le redefinir OBLIGATOIREMENT alors ?
 
Franchement, la necessite de redefinir la methode hashCode (), je ne vois pas trop. J'aimerais bien que tu me donnes un cas precis, ou il s'avere utile de la redefinir.
 
Sinon, j'ai fais ce que tu as dis dans un programme, (redefinir equals et hashCode) et mon programme ne marche pas pour autant :/
(cf topic : http://forum.hardware.fr/hardwaref [...] 748-1.htm)
 
Merci de ton aide :jap

tu sais ce que c'est une table de hachage ? bah les tables de hachage en java fonctionnent avec equals() et hashCode(), si les 2 ne sont pas cohérents, tu ne retrouves jamais un objet dans ta table.

n°793575
Giz
Posté le 12-07-2004 à 14:29:51  profilanswer
 

Jubijub a écrit :

ben ca dépend quel sens tu donnes à l'égalité...
 
par ex dans mon appli je considère 2 objets égaux si ils ont le même identifiant (un champ String)...
 
le hashcode renverra forcément des trucs différents pour 2 objets, qui pourtant seront égaux selon mon acceptation...donc je dois redéfinir hashcode aussi


 
tout a fait, autant pour moi !  :jap:
 
 ... jme melange les pinceaux par moment  [:spamafote] (avant de comparer les cles (methode equals), faut deja aller chercher dans la bonne case de la table (donne par la methode hashCode ()) :D)
 
EDIT : bien que ca s'eclairci, kk1 peut m'aider dans mon topic :
 http://forum.hardware.fr/hardwaref [...] 4748-1.htm
j'ai fais ce qu'il fallait pourtant :sweat:


Message édité par Giz le 12-07-2004 à 14:31:38
n°793583
Giz
Posté le 12-07-2004 à 14:34:12  profilanswer
 

Oups, non c'est bon la !
 
bon Merci a tous  :hello:

n°793587
Giz
Posté le 12-07-2004 à 14:38:44  profilanswer
 

Derniere petit detail : Comment forcer une classe a redefinir les methode equals et hashCode ?

n°793597
nraynaud
lol
Posté le 12-07-2004 à 14:41:35  profilanswer
 

on peut pas.

n°793708
Giz
Posté le 12-07-2004 à 15:51:37  profilanswer
 


 
Bon, ça a le merite d'etre clair.  :jap: ... c'est con ça tout de meme :/ (c'est a specifier dans la doc alors parce que mon programme prend l'Object de l'utilisateur comme clé)


Message édité par Giz le 12-07-2004 à 15:53:22
n°793716
nraynaud
lol
Posté le 12-07-2004 à 15:58:33  profilanswer
 

et alors ? les versions par défaut de hashcode() et equals() fonctionnent bien, toute personne qui y touche sait qu'elle doit toucher aux 2 en même temps, je vois pas le pb.

n°793722
the real m​oins moins
Posté le 12-07-2004 à 16:02:49  profilanswer
 

on peut[:spamafote]

Code :
  1. abstract class Machin {
  2. ...
  3. public hashcode() {
  4.    return mandatoryHashcode();
  5. }
  6. abstract mandatoryHashcode();
  7. }


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°793735
Giz
Posté le 12-07-2004 à 16:15:10  profilanswer
 

nraynaud a écrit :

et alors ? les versions par défaut de hashcode() et equals() fonctionnent bien, toute personne qui y touche sait qu'elle doit toucher aux 2 en même temps, je vois pas le pb.


 
disons que l'utilisateur , lui , ne sait pas que j'utilise une table de hash, donc il a aucune raison a implementer equals () et hashCode () :/
...et les versions par defaut ne marche bien que pour les type primitifs (String, Integer) ... qd c'est Object, equals () et hashCode doivent apparaitre !


Message édité par Giz le 12-07-2004 à 16:16:41
n°793738
Giz
Posté le 12-07-2004 à 16:18:37  profilanswer
 

the real moins moins a écrit :

on peut[:spamafote]

Code :
  1. abstract class Machin {
  2. ...
  3. public hashcode() {
  4.    return mandatoryHashcode();
  5. }
  6. abstract mandatoryHashcode();
  7. }



 
Hum...ca m'a l'air d'etre une methode convenable ça :)

n°793742
nraynaud
lol
Posté le 12-07-2004 à 16:24:09  profilanswer
 

Giz a écrit :

Object, equals () et hashCode doivent apparaitre !

qunad c'est object, par défaut ce sont des version fondées sur l'identitée, qui sont celles qui fonctionnent le mieux et sont les plus rapides.

n°793746
Giz
Posté le 12-07-2004 à 16:29:29  profilanswer
 

nraynaud a écrit :

qunad c'est object, par défaut ce sont des version fondées sur l'identitée, qui sont celles qui fonctionnent le mieux et sont les plus rapides.


 
Par le mot Object j'entends structure de données  :o (sauf Integer et String)  
...comparer ou hasher une structure de données requiert l'implementation de equals() et de hashCode() donc.
Celle par defaut se contente de hasher les types Object seulement via leur adresse ce qui la plupart du temps donne des resultats inattendus

n°793787
nraynaud
lol
Posté le 12-07-2004 à 17:00:47  profilanswer
 

Giz a écrit :

ce qui la plupart du temps donne des resultats inattendus

??? c'est cette réponse qui est inattendue !!!
 
en quoi l'identité donne des résultats inattendus ? L'égalité est justement sensée inclure l'identité.

n°793876
Giz
Posté le 12-07-2004 à 17:45:00  profilanswer
 

nraynaud a écrit :

??? c'est cette réponse qui est inattendue !!!
 
en quoi l'identité donne des résultats inattendus ? L'égalité est justement sensée inclure l'identité.


 
...d'ou la necessite de definir equals pour les Objects

n°797686
- Renaud -
Posté le 16-07-2004 à 14:06:40  profilanswer
 

El_gringo a écrit :

Donc toi tu dirais qu'ils mettent 29, comme ils auraient pu mettre n'importe quel autre nombre 1er ?


 
29 est mieux que 101 !!!
 
les deux sont 1er je suis d'accord
quand la hashtable s'aggrandit, par défaut, on fait size = size*2+1
avec 29 ça donne 29 (1er) - 59 (1er) - 119 - 239 (1er) - 479 (1er)
 
avec 101 ça donne 101 (1er) - 203 - 407 - 815 - 1631
 
donc en moyenne une hashtable qui commence avec 29 aura plus souvent une taille correspondant à un nombre 1er
 
voili-voilou

n°797693
Giz
Posté le 16-07-2004 à 14:12:57  profilanswer
 

- Renaud - a écrit :

29 est mieux que 101 !!!
 
les deux sont 1er je suis d'accord
quand la hashtable s'aggrandit, par défaut, on fait size = size*2+1
avec 29 ça donne 29 (1er) - 59 (1er) - 119 - 239 (1er) - 479 (1er)
 
avec 101 ça donne 101 (1er) - 203 - 407 - 815 - 1631
 
donc en moyenne une hashtable qui commence avec 29 aura plus souvent une taille correspondant à un nombre 1er
 
voili-voilou


 
C'est pas seulement "plus souvent" qu'il faut, c'est toujours. La taille de la table de hash doit etre sur qu'elle est egale à un nombre premier. En principe pour gerer les tailles des tables de hash, on dispose en plus, une table de nombre premier toute construite en dur.
 
C'est ce que m'avait dit mon prof de structure de donnees. Et en plus cela se confirme par le code source present dans la glib sur les hashtables pour linux (ghash.c), ils font comme ca  :)
 
EDIT : et cette maniere de faire n'est pas conne du tout car la taille memoire que prend une table de nombre 1er est negligeable face a la taille memoire que prend une table de hash ;)
 
EDIT 2: ... a moins qu'il existe un algo rapide en O(1) pour verifier si le nombre est 1er ... mais s'il ne l'est pas jusqu'ou faudra-t-il alle dans la suite ? :heink: (sans depasser la taille d'un int)


Message édité par Giz le 16-07-2004 à 14:20:18
n°797717
Jubijub
Parce que je le VD bien
Posté le 16-07-2004 à 14:34:46  profilanswer
 

intéressant...


---------------
Jubi Photos : Flickr - 500px
n°797874
nraynaud
lol
Posté le 16-07-2004 à 16:09:50  profilanswer
 

- Renaud - a écrit :

29 est mieux que 101 !!!
 
les deux sont 1er je suis d'accord
quand la hashtable s'aggrandit, par défaut, on fait size = size*2+1
avec 29 ça donne 29 (1er) - 59 (1er) - 119 - 239 (1er) - 479 (1er)
 
avec 101 ça donne 101 (1er) - 203 - 407 - 815 - 1631
 
donc en moyenne une hashtable qui commence avec 29 aura plus souvent une taille correspondant à un nombre 1er
 
voili-voilou

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 !!!!
 
http://www.javaspecialists.co.za/archive/Issue054.html une explication par le mec qui a décidé ça.
 
des petits bouts de JDK :

Code :
  1. public HashMap(int initialCapacity, float loadFactor) {
  2.         if (initialCapacity < 0)
  3.             throw new IllegalArgumentException("Illegal initial capacity: " +
  4.                                                initialCapacity);
  5.         if (initialCapacity > MAXIMUM_CAPACITY)
  6.             initialCapacity = MAXIMUM_CAPACITY;
  7.         if (loadFactor <= 0 || Float.isNaN(loadFactor))
  8.             throw new IllegalArgumentException("Illegal load factor: " +
  9.                                                loadFactor);
  10.         // Find a power of 2 >= initialCapacity
  11.         int capacity = 1;
  12.         while (capacity < initialCapacity)
  13.             capacity <<= 1;
  14.    
  15.         this.loadFactor = loadFactor;
  16.         threshold = (int)(capacity * loadFactor);
  17.         table = new Entry[capacity];
  18.         init();
  19.     }


 

Code :
  1. /**
  2.      * Returns index for hash code h.  
  3.      */
  4.     static int indexFor(int h, int length) {
  5.         return h & (length-1);
  6.     }

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

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