Vous êtes sur la page 1sur 5

Table de hachage

Table de hachage
Une table de hachage est en informatique, une structure de donnes qui permet une association cl-lment, c'est--dire une implmentation du type abstrait table de symboles. On accde chaque lment de la table via sa cl. Il s'agit d'un tableau ne comportant pas d'ordre (un tableau est index par des entiers). L'accs un lment se fait en transformant la cl en une valeur de hachage (ou simplement hachage) par l'intermdiaire d'une fonction de hachage. Le hachage est un nombre qui permet la localisation des lments dans le tableau, typiquement le hachage est l'index de l'lment dans le tableau. Une case dans le tableau est appele alvole. Tout comme les tableaux, les tables de hachage permettent un accs en O(1) en moyenne, quel que soit le nombre d'lments dans la table. Toutefois le temps d'accs dans le pire des cas peut tre de O(n). Compares aux autres tableaux associatifs, les tables de hachage sont surtout utiles lorsque le nombre d'entres est trs important. La position des lments dans une table de hachage est pseudo-alatoire. Un annuaire reprsent comme une table de hachage. Cette structure n'est donc pas adapte pour accder des donnes tries. Des types de structures de donnes comme les arbres quilibrs sont gnralement plus lents (en O(log n)) et sont plus complexes implmenter, mais maintiennent une structure ordonne. Le fait de crer un hash partir d'une cl peut engendrer un problme de collision, cest--dire qu' partir de deux cls diffrentes, la fonction de hachage pourrait renvoyer la mme valeur de hash, et par consquent donner accs la mme position dans le tableau. Pour minimiser les risques de collisions, il faut donc choisir soigneusement sa fonction de hachage.

Choix d'une bonne fonction de hachage


Une bonne fonction de hachage est cruciale pour les performances. Les collisions tant en gnral rsolues par des mthodes de recherche linaire, une mauvaise fonction de hachage, i.e. produisant beaucoup de collisions, va fortement dgrader la rapidit de la recherche. D'autre part, il est prfrable que la fonction de hachage ne soit pas de complexit leve. Le calcul du hachage se fait parfois en deux temps : 1. Une fonction de hachage particulire l'application est utilise pour produire un nombre entier partir de la donne d'origine. 2. Ce nombre entier est converti en une position possible de la table, en gnral en calculant le reste modulo la taille de la table. Les tailles des tables de hachage sont souvent des nombres premiers, afin d'viter les problmes de diviseurs communs, qui creraient un nombre important de collisions. Une alternative est d'utiliser une puissance de deux, ce qui permet de raliser l'opration modulo par de simples dcalages, et donc de gagner en rapidit. Un problme frquent et surprenant est le phnomne de clustering qui dsigne le fait que des valeurs de hachage se retrouvent cte cte dans la table, formant des clusters. Ceci est trs pnalisant pour les techniques de rsolution

Table de hachage des collisions par adressage ouvert. Les fonctions de hachage ralisant une distribution uniforme des hachages sont donc les meilleures, mais sont en pratique difficiles trouver. Dans les environnements o un adversaire essaye d'attaquer les performances de la recherche en soumettant des entres gnrant un grand nombre de collisions afin de ralentir la recherche, une solution est le hashing universel, qui slectionne alatoirement une fonction de hachage au dbut de l'algorithme. L'adversaire n'a alors pas de moyen de connaitre le type de donnes qui produira des collisions.

Rsolution des collisions


Lorsque deux cls ont la mme valeur de hachage, ces cls ne peuvent tre stockes la mme position, on doit alors employer une stratgie de rsolution des collisions. Pour donner une ide de l'importance d'une bonne mthode de rsolution des collisions, considrons ce rsultat issu du paradoxe des anniversaires. Mme si nous sommes dans le cas le plus favorable o la fonction de hachage a une distribution uniforme, il y a 95 % de chances d'avoir une collision dans une table de taille 1 million avant qu'elle ne contienne 2500 lments. De nombreuses stratgies de rsolution des collisions existent, mais les plus connues et utilises sont le chainage et l'adressage ouvert.

Chanage
Cette mthode est la plus simple. Chaque case de la table est en fait une liste chane des cls qui ont le mme hachage. Une fois la case trouve, la recherche est alors linaire en la taille de la liste chane. Dans le pire des cas o la fonction de hachage renvoie toujours la mme valeur de hachage quelle que soit la cl, la table de hachage devient alors une liste chane, et le temps de recherche est en Rsolution des collisions par chanage. O(n). L'avantage du chanage est que la suppression d'une cl est facile, et que l'agrandissement de la table peut tre retard plus longtemps que dans l'adressage ouvert, les performances se dgradant moins vite. D'autres structures de donnes que les listes chanes peuvent tre utilises. En utilisant un arbre quilibr le cot thorique de recherche dans le pire des cas est en O(log n). Cependant, la liste tant suppose tre courte, cette approche est en gnral peu efficace moins d'utiliser la table sa pleine capacit, ou d'avoir un fort taux de collisions. Un tableau dynamique peut aussi tre utilis pour rduire la perte d'espace mmoire et amliorer les performances du cache lorsque le nombre d'lments est petit.

Table de hachage

Adressage ouvert
L'adressage ouvert consiste dans le cas d'une collision stocker les valeurs de hachage dans des cases contiges. La position de ces cases est dtermine par une mthode de sondage. Lors d'une recherche, si la case obtenue par hachage direct ne permet pas d'obtenir la bonne cl, une recherche sur les cases obtenues par une mthode de sondage est effectue jusqu' trouver la cl, ou non, ce qui indique qu'aucune cl de ce type n'appartient la table. Les mthodes de sondage courantes sont :
Rsolution des collisions par adressage ouvert et sondage linaire.

le sondage linaire : l'intervalle entre les cases est fixe, souvent 1 ; le sondage quadratique : l'intervalle entre les cases augmente linairement (les indices des cases augmentent donc quadratiquement), ce qui peut s'exprimer par la formule : le double hachage : l'adresse de la case est donne par une deuxime fonction de hachage, ou hachage secondaire. Le sondage linaire possde la meilleure performance en termes de cache, mais est sensible l'effet de clustering dcrit plus haut. Le double hachage ne permet pas d'utiliser le cache efficacement, mais permet de rduire presque compltement les problmes de clustering, en contrepartie d'une complexit plus leve. Le sondage quadratique se situe entre le linaire et le double hashing au niveau des performances. Une indication critique des performances d'une table de hachage est le facteur de compression fc, qui est la proportion de cases utilises dans la table. Plus le facteur de compression est proche de 100 %, plus le nombre de sondages effectuer devient important. Lorsque la table est pleine, les algorithmes de sondage peuvent mme chouer. Le facteur de compression est en gnral limit 80 %, mme en disposant d'une bonne fonction de hachage. Des facteurs de charge faibles ne sont pas pour autant significatifs de bonne performances, en particulier si la fonction de hachage est mauvaise et gnre du clustering.

Hachage probabiliste
Cette section est vide, insuffisamment dtaille ou incomplte. Votre aide [1] est la bienvenue !

Modification de la taille de la table


Lorsque le facteur de compression de la table augmente au del de 50 %, le nombre de collisions augmente sensiblement. Une solution est d'augmenter la taille de la table sitt atteint ce taux, tout en maintenant cette taille un nombre premier. Le Rehachage (rehash) est une fonction qui, en gnral, double (au moins) l'espace mmoire allou pour la table, et recopie ses valeurs (temps d'excution en O(n)). Cette fonction cherche le plus petit nombre premier suprieur 2 fois sa taille.

Table de hachage

Fonction de hachage
Article dtaill : fonction de hachage. Une fonction de hachage permet de transformer une cl en une valeur de hachage (un index), donnant ainsi la position d'un lment dans le tableau. Si la cl n'est pas un entier naturel, il faut trouver un moyen de la considrer comme tel. Par exemple, si la cl est de type chaine de caractres, on peut calculer la somme des positions dans l'alphabet de chaque lettre pour obtenir un entier naturel. Il suffit ensuite de transformer cet entier en index par diffrentes faons. Par exemple, en prenant le reste de la division de l'entier par le nombre d'lments dans le tableau.

Rfrences
(en) Donald Knuth, The Art of Computer Programming, vol.3: Sorting and Searching, Addison-Wesley, 1997, 3ed. (ISBN0-201-89685-0), partie6, chap.4 (Hashing), p.513558 (en) Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest et Clifford Stein, Introduction to Algorithms, MIT Press and McGraw-Hill, 2001, 2ed. (ISBN0-262-03293-7), chap.11 (Hash Tables), p.221252 (en) Michael T. Goodrich et Roberto Tamassia, Data Structures and Algorithms in Java, John Wiley & Sons, Inc., 4ed. (ISBN0-471-73884-0), chap.9 (Maps and Dictionaries), p.369418 Christine Froidevaux, Marie-Claude Gaudel et Michle Soria, Types de donnes et algorithmes, McGraw-Hill, coll.Informatique, 1990, 575p. (ISBN2-8407-4023-0) Portail de linformatique

Rfrences
[1] http:/ / fr. wikipedia. org/ w/ index. php?title=Table_de_hachage& action=edit

Sources et contributeurs de larticle

Sources et contributeurs de larticle


Table de hachage Source: http://fr.wikipedia.org/w/index.php?oldid=92104916 Contributeurs: A3 nm, Alkarex, B0t, Bayo, COLETTE, Dake, DocteurCosmos, EDUCA33E, FitzSai, Foxandpotatoes, Francis.sourd, Franckyboy, GaMip, HAF 932, JLM, Jim2k, Kassus, Kelson, Love Sun and Dreams, Manuguf, Moala, Papier K, Pautard, Pemelet, Philippe.petrinko, Rgis B., Sam Hocevar, Shawn, Stendhalconques, Sylenius, T, Theone256, Topeil, Turb, Ugo14, Xaltar92, 41 modifications anonymes

Source des images, licences et contributeurs


Fichier:HASHTB08.svg Source: http://fr.wikipedia.org/w/index.php?title=Fichier:HASHTB08.svg Licence: Public Domain Contributeurs: Helix84, Simeon87, Xhienne, Yonidebest, 1 modifications anonymes Fichier:HASHTB32.svg Source: http://fr.wikipedia.org/w/index.php?title=Fichier:HASHTB32.svg Licence: Public Domain Contributeurs: Helix84, Simeon87, Xhienne Fichier:HASHTB12.svg Source: http://fr.wikipedia.org/w/index.php?title=Fichier:HASHTB12.svg Licence: Public Domain Contributeurs: Helix84, Simeon87, Velociostrich, Xhienne Fichier:Crystal mycomputer.png Source: http://fr.wikipedia.org/w/index.php?title=Fichier:Crystal_mycomputer.png Licence: inconnu Contributeurs: Dake, Rocket000

Licence
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/