Qu'est-ce que Table de hachage (hash table) ?

Structure de données qui calcule une position de stockage à partir d'une clé au moyen d'une fonction de hachage, ce qui permet la recherche, l'insertion et la suppression en O(1) en moyenne. Les collisions, où des clés différentes tombent sur la même position, sont traitées par chaînage ou par adressage ouvert.

Nom japonais: ハッシュテーブル

« Table de hachage (hash table) » apparaît dans 7 questions d'entraînement réparties sur 4 thèmes, dont Structures de données et algorithmes, Probabilités, statistiques et files d'attente, Hiérarchie mémoire.

Domaine: Structures de données et algorithmes

Fonctionnement et traitement des collisions

Une table de hachage convertit une clé en entier au moyen d'une fonction de hachage et utilise, par exemple, le reste de sa division par la taille de la table comme position de stockage. Il existe beaucoup plus de clés possibles que de positions, si bien que les collisions, où des clés différentes tombent sur la même position, sont inévitables. Le chaînage relie les éléments d'une même position, par exemple dans une liste chaînée. L'adressage ouvert cherche une autre position libre dans la table, avec des méthodes comme le sondage linéaire, qui examine tour à tour les positions voisines, ou le double hachage, qui utilise une seconde fonction de hachage pour choisir le pas.

Facteur de charge et rehachage

Le nombre d'éléments stockés divisé par la taille de la table s'appelle le facteur de charge. Avec le chaînage, la longueur moyenne des listes est proportionnelle au facteur de charge ; avec l'adressage ouvert, le nombre de sondages pour trouver un emplacement libre augmente fortement quand le facteur de charge approche de 1. Quand le facteur de charge dépasse une limite choisie, on agrandit donc la table, généralement à environ deux fois sa taille, et on réinsère tous les éléments (rehachage). Un rehachage coûte O(n), mais comme les intervalles entre agrandissements doublent à chaque fois, le coût par insertion reste en O(1) amorti.

Performances et précautions

La moyenne en O(1) suppose que la fonction de hachage répartit les clés uniformément dans la table. Une mauvaise fonction de hachage, ou une entrée conçue pour provoquer des collisions (attaque par inondation de hachage, hash flooding), peut dégrader les performances jusqu'à O(n) dans le pire cas : les serveurs web et les logiciels similaires utilisent donc des fonctions de hachage mélangées à une graine aléatoire. Une table de hachage ne conserve pas non plus ses éléments dans l'ordre : les arbres binaires de recherche ou les arbres B conviennent mieux aux recherches par intervalle et aux listages ordonnés. La vitesse réelle dépend aussi du comportement du cache : les méthodes qui examinent les emplacements voisins, comme le sondage linéaire, sont souvent plus rapides que le chaînage, qui suit des pointeurs.

S'entraîner : questions sur Table de hachage (hash table)

On range 10 clés dans une table de hachage de 100 compartiments. Chaque clé est affectée indépendamment à l'un des 100 compartiments avec la même probabilité. Quelle est l'espérance du nombre de paires de clés affectées au même compartiment ?

  1. A0,1
  2. B0,45
  3. C0,9
Afficher la réponse et l'explication

Réponse : B. 0,45

Il y a 10C2 = 45 paires de clés, et chaque paire tombe dans le même compartiment avec une probabilité de 1/100. Par la linéarité de l'espérance (l'espérance d'une somme est la somme des espérances), l'espérance du nombre de paires dans un même compartiment vaut 45 × 1/100 = 0,45. La linéarité de l'espérance est vraie même si les paires ne sont pas indépendantes : il suffit d'additionner les probabilités de chaque paire.

Quelle description d'une collision dans une table de hachage est correcte ?

  1. ALe fait de pouvoir retrouver la clé d'origine à partir de sa valeur de hachage
  2. BLe fait que des clés différentes donnent la même valeur de hachage (la même position de stockage)
  3. CLe fait qu'une même clé donne une valeur de hachage différente à chaque exécution du programme
Afficher la réponse et l'explication

Réponse : B. Le fait que des clés différentes donnent la même valeur de hachage (la même position de stockage)

Une table de hachage calcule une position de stockage à partir de la clé au moyen d'une fonction de hachage, ce qui permet la recherche, l'insertion et la suppression en O(1) en moyenne. Comme il existe beaucoup plus de clés possibles que d'emplacements dans la table, il est impossible d'éviter que des clés différentes tombent sur la même position (collision). On traite donc les collisions par des méthodes comme le chaînage, qui relie en liste les éléments d'une même position, ou l'adressage ouvert, qui cherche une autre position libre. Une même clé doit toujours donner la même valeur de hachage, sinon la recherche échouerait ; quant à la possibilité de retrouver la clé à partir de la valeur de hachage, c'est une propriété qui compte pour l'usage cryptographique, pas une collision.

Questions fréquentes

Quel est le lien entre tables de hachage et fonctions de hachage ?

Une fonction de hachage calcule à partir d'une clé une valeur comprise dans un intervalle fixe, et une table de hachage est une structure de données qui l'utilise pour calculer des positions de stockage. Les fonctions de hachage pour tables de hachage privilégient la rapidité et une répartition uniforme, et n'ont généralement pas besoin d'être à sens unique comme les fonctions de hachage cryptographiques.

Où utilise-t-on les tables de hachage ?

Partout où il faut retrouver rapidement des valeurs par leur clé : dictionnaires (tableaux associatifs) et ensembles des langages de programmation, tables des symboles des compilateurs, jointures par hachage et index par hachage des bases de données, gestion des caches, etc.

« Table de hachage (hash table) » dans les explications

Questions mentionnant « Table de hachage (hash table) » (7)

  1. On range 10 clés dans une table de hachage de 100 compartiments. Chaque clé est affectée indépendamment à l'un des 100 compartiments avec la même probabilité. Quelle est l'espérance du nombre de paires de clés affectées au même compartiment ?
  2. Quelle description d'une collision dans une table de hachage est correcte ?
  3. On range dans cet ordre les clés 10, 17, 24 et 3 dans une table de hachage de taille 7 (positions 0 à 6) avec la fonction de hachage h(k) = k mod 7. Les collisions sont résolues par sondage linéaire, qui avance d'une position à la fois (en revenant de 6 à 0) pour trouver un emplacement libre. À quelle position la clé 3 est-elle rangée ?
  4. Quelle comparaison du chaînage (relier par une liste chaînée les éléments d'une même position) et de l'adressage ouvert (chercher une autre position libre dans la table), comme méthodes de résolution des collisions d'une table de hachage, est correcte ? Le facteur de charge est le nombre d'éléments stockés divisé par la taille de la table.
  5. Pour une table de hachage contenant de nombreux éléments et maintenue à un facteur de charge d'environ 0,5, quelle est la raison la plus appropriée pour laquelle l'adressage ouvert avec sondage linéaire tend à être plus rapide que le chaînage (relier les éléments par des listes chaînées) ?
  6. Pour quel type d’accès le préchargement matériel est-il particulièrement efficace ?
  7. Quelle comparaison entre le « verrouillage à gros grain », qui protège toute une grande structure de données par un seul verrou, et le « verrouillage à grain fin », qui protège chaque partie par un verrou distinct, est correcte ?

Termes associés

Liste chaînée (linked list) Fonction de hachage Préchargement (prefetch) Espérance (espérance mathématique) Ligne de cache Pointeur Complexité temporelle (notation grand O) Tableau Algorithme de Dijkstra Algorithme glouton (greedy)

Retour au glossaire