Où trouver le chapitre « Ce qui m’intéresse » dans un livre ? Où va la commande de Marie Dupont ? Où peut-on acheter cette montre avec un bracelet en cuir brun ? Quel est le point commun entre ces trois phrases ? Pre­miè­re­ment, il s’agit de trois questions. Ensuite, ces trois phrases portent sur un lieu (« Où ? »). Fi­na­le­ment, ces trois questions pré­sup­po­sent également que le résultat recherché existe. Ce modèle de pensée est fa­ci­le­ment trans­po­sable aux bases de données.

Re­pré­sen­tez-vous une boutique en ligne avec des milliers d’articles et de clients. Toutes ces données sont en­re­gis­trées dans des bases de données. Le client recherche un article précis dans la base de données et passe commande ; l’ex­pé­di­teur associe l’article commandé à l’adresse du client via la base de données. Cette as­so­cia­tion entraîne diverses tâches de recherche et de tri ainsi que dif­fé­rents processus d’insertion et de sup­pres­sion pendant le processus de commande. Pour faciliter la réa­li­sa­tion de ces tâches, les grands volumes de données ap­par­te­nant à un même ensemble sont réunis sous une même position d’adressage dans la base de données. Cette position est calculée avec des valeurs de hachage et se compose ensuite d’un tableau avec des com­bi­nai­sons de chiffres et de lettres de même longueur. Notre guide vous explique les principes d’uti­li­sa­tion de ces tables de hachage.

Quel est le principe d’une table de hachage ?

On calcule tout d’abord une valeur de hachage à partir des in­for­ma­tions d’un ensemble de données. La table de hachage comprend les valeurs de hachage de tous les ensembles de données d’une base de données. Une seconde opération ma­thé­ma­tique calcule la position d’en­re­gis­tre­ment des in­for­ma­tions dans la base de données à partir de la valeur de hachage. Lorsque l’uti­li­sa­teur indique un mot-clé, celui-ci est également haché. On ne recherche alors plus la « montre avec un bracelet en cuir brun » mais une cor­res­pon­dance de la valeur hachée ini­tia­le­ment pour l’article avec la valeur de hachage du mot-clé qui vient d’être utilisé, c’est-à-dire une cor­res­pon­dance entre deux séquences de chiffres et de lettres. Ce processus est utilisé pour des solutions très dif­fé­rentes.

Une plus grande sécurité grâce aux valeurs de hachage

On obtient une table de hachage en at­tri­buant à des termes des valeurs de hachage générées au­to­ma­ti­que­ment. La fonction de hachage utilisée à cet effet génère un « hash » (valeur de hachage), c’est-à-dire une suite de ca­rac­tères disposant toujours de la même longueur. La longueur de la suite de caractère et les ca­rac­tères qu’elle contient sont définis par la méthode de hachage utilisée. Ce procédé est par exemple utilisé pour accroître la sécurité des données d’accès contre les attaques.

Dans notre exemple de base de données WordPress, lors de la tentative de connexion, le mot de passe de l’uti­li­sa­teur saisi est converti en valeur de hachage avec le même procédé, puis comparé avec l’entrée existant dans la base de données sous le champ « user_pass ». L’accès est autorisé si les deux valeurs de hachage de 34 ca­rac­tères cor­res­pon­dent. Il est im­pos­sible de dé­chif­frer la valeur de hachage pour obtenir le mot de passe. C’est l’une des qualités des fonctions de hachage.

Dans le cas de ten­ta­tives d’intrusion – comme dans l’attaque par force brute –, il faudra alors tester cette chaîne de ca­rac­tères avec tous les ca­rac­tères autorisés pour parvenir à trouver une cor­res­pon­dance. En con­nais­sant la fonction de hachage utilisée et en utilisant des ma­jus­cules, des mi­nus­cules et des chiffres dans un mot de passe de 10 ca­rac­tères, il faudrait à un hacker pré­ci­sé­ment 839 299 365 868 340 200 ten­ta­tives pour dé­ter­mi­ner une cor­res­pon­dance.

Un accès plus rapide aux bases de données

Dans les bases de données, les tables de hachage sont utilisées pour accélérer les pro­cé­dures d’accès ainsi que la saisie et la sup­pres­sion des ensembles de données. Par exemple, si l’on recherche un prénom dans une base de données ré­per­to­riant tous les employés d’une en­tre­prise, cette recherche peut demander un temps con­si­dé­rable puisque les champs de la base de données sont analysés les uns après les autres (de façon sé­quen­tielle) afin de trouver une cor­res­pon­dance. En con­ver­tis­sant le mot-clé en valeur de hachage puis en re­cher­chant une cor­res­pon­dance dans la table de hachage, on gagne gé­né­ra­le­ment un temps con­si­dé­rable.

Comment ce processus se déroule-t-il ? Chaque ensemble de données reçoit une adresse unique. Ce type d’adressage est toujours identique au sein d’une base de données (001, 002, 003 ou 00A1, 00A2, 00A3, etc.). Cette adresse est calculée à l’aide d’une fonction de hachage.

Voici un exemple simple : prenons une base de données pouvant contenir 11 entrées, de la position 0 à 10. Le nom « Lisa » est composé de quatre ca­rac­tères ASCII disposant de codes ASCII cor­res­pon­dants : L cor­res­pond à 76, i à 105, s à 115 et a à 97. Vous pouvez essayer par vous-même sous Windows : [Alt] + 0076 donne par exemple « L ». Si l’on ad­di­tionne toutes les valeurs ASCII, cela nous donne la valeur de hachage 393 pour « Lisa ». L’addition des valeurs ASCII cor­res­pond ici à une fonction de hachage.

On procède alors au calcul de la valeur ré­si­duelle avec des nombres entiers : 393 % 11 (positions) = 35, reste 8 (dans de nombreux langages de pro­gram­ma­tion, le symbole « % » est l’opérateur ma­thé­ma­tique per­met­tant de calculer la valeur ré­si­duelle). Cette valeur ré­si­duelle détermine à quelle position de la base de données – dans notre exemple, l’indice numéro 8 – seront en­re­gis­trées Lisa et toutes les autres données la con­cer­nant. On peut fa­ci­le­ment imaginer qu’en utilisant ce type d’adressage, on obtient souvent la même valeur ré­si­duelle. Toutefois, plus on a de positions d’en­re­gis­tre­ment et plus la valeur de hachage est longue, moins il y aura de pro­ba­bi­lité d’obtenir un tel doublon. Pour « Alis Meyer », on ob­tien­drait une tout autre position alors que le prénom comporte les « mêmes » lettres. Toutefois, comme le « A » est une majuscule et le « l » une minuscule, cela change la donne.

Le problème des doublons peut être observé dans notre schéma : il est tout à fait possible que des noms dif­fé­rents ob­tien­nent le même indice pro­vo­quant ainsi des « col­li­sions » (flèches bleu clair). Que « fait » la base de données de ces « col­li­sions » ? Elle place l’ensemble de données à l’em­pla­ce­ment libre de la base de données le plus proche. Dans notre exemple, si l’on recherche « Berta Müller », la recherche ne commence pas à la position 001. Le pointeur de recherche est placé au début de la position d’indice 003, ce qui re­pré­sente un (léger) gain de temps. Cette méthode, dans laquelle on effectue une recherche linéaire, est appelée hachage avec adressage ouvert.

L’adressage chaîné (chaînage) est une autre méthode dans laquelle aucun nouvel ensemble de données n’est « ouvert » et la seconde entrée per­ti­nente est placée à la chaîne après la première entrée per­ti­nente. De cette façon, il suffit d’une recherche pour trouver l’ensemble de données recherché situé à la même position d’en­re­gis­tre­ment, « derrière » le premier ensemble de données. Cette méthode permet de gagner en rapidité de trai­te­ment.

Dès le début de la recherche de « Berta Müller », le pointeur de données est placé sur l’indice 003 calculé à partir de la table de hachage. Par con­sé­quent, il est né­ces­saire d’explorer un seul ensemble de données chaîné. Cette méthode permet de ras­sem­bler de gros volumes de données de façon élégante et d’effectuer des re­cherches plus rapides.

Ce principe est également utilisé pour la mise en cache afin de pouvoir disposer plus ra­pi­de­ment des données déjà utilisées au préalable. Ces données sont en­re­gis­trées dans le cache – une mémoire tem­po­raire – et peuvent y être con­sul­tées en cas de cor­res­pon­dance avec un modèle d’activité. Cela se produit notamment lorsque des uti­li­sa­teurs ont déjà visité un site internet. Dans ce cas, le serveur ne doit pas charger à nouveau le site internet en­tiè­re­ment, puisque ce dernier peut être consulté di­rec­te­ment depuis le cache qui offre un accès bien plus rapide. Une telle iden­ti­fi­ca­tion par com­pa­rai­son est également réalisée par les cookies lorsque l’uti­li­sa­teur a déjà visité un site internet.

Quelles variantes de hachage existe-t-il ?

La procédure de hachage qui vient d’être décrite est également appelée hachage ouvert ou externe. Dans ce cadre, les données peuvent être en­re­gis­trées dans des listes chaînées au sein d’un espace de stockage théo­ri­que­ment illimité. Dans ce cas, on ne dispose plus de clés, mais le chaînage permet de gérer des volumes de données plus con­sé­quents. L’adjectif « ouvert » renvoie à l’adressage ouvert.

Dans le hachage fermé, le nombre de clés dis­po­nibles est limité par la capacité de la table. Si l’on essaie d’en­re­gis­trer davantage de données, un dé­bor­de­ment (overflow) se produit. Lorsque la table est à nouveau explorée, le système procède à un sondage pour savoir à quelles positions libres de tels « dé­bor­de­ments » peuvent être placés.

Note

L’uti­li­sa­tion des termes hachage « ouvert » et « fermé » n’est pas clai­re­ment établie. Dans les pu­bli­ca­tions, ils sont parfois utilisés pour désigner le procédé opposé. Par con­sé­quent, il est re­com­mandé d’utiliser la des­crip­tion détaillée du procédé.

Le hachage du coucou sert également à éviter les col­li­sions dans une table de base de données. Il doit son nom au com­por­te­ment du coucou qui retire les œufs des nids des autres oiseaux pour y placer les siens. Deux fonctions de hachage sont donc utilisées pour définir deux positions d’en­re­gis­tre­ment. Si la première position est déjà occupée, la clé qui s’y trouve est déplacée à une autre position alors que la seconde clé générée est placée à la première position d’en­re­gis­tre­ment. L’in­con­vé­nient de cette méthode est qu’il peut se former une boucle de recherche infinie qui pro­vo­quera l’in­ter­rup­tion d’une routine initiée du fait d’un dé­pas­se­ment de délai.

Pour sonder une base de données, il existe dif­fé­rentes méthodes élaborées à partir de formules ma­thé­ma­tiques complexes. Sur les sites internet, elles sont dis­si­mu­lées derrière un code de programme, par exemple derrière un simple champ de recherche re­pré­senté par une loupe.

En général, les bases de données sont ré­gu­liè­re­ment com­plé­tées et le volume de données augmente très ra­pi­de­ment. Le hachage dynamique tient compte de cette évolution en élar­gis­sant la table de hachage afin d’éviter les col­li­sions. Cependant, cette extension implique que les valeurs de hachage des données déjà en­re­gis­trées changent au fur et à mesure que la table augmente. Des fonctions de hachage spéciales ont été dé­ve­lop­pées pour apporter une solution à ce problème. De cette façon, il n’existe (en théorie) aucune limite au volume de données. Les processus de recherche sont toutefois moins efficaces.

Avantages et in­con­vé­nients des tables de hachage

Le principal avantage de l’uti­li­sa­tion d’une table de hachage est la pos­si­bi­lité d’effectuer une recherche rapide dans de très grands volumes de données. Cependant, les créateurs de la base de données doivent relever le défi d’estimer au préalable la taille né­ces­saire afin de limiter un maximum les risques de col­li­sions. De nombreux types de données peuvent être utilisés pour autant que l’on puisse calculer des valeurs de hachage à partir de ces données.

Le point faible de cette approche réside notamment dans le fait que les bases de données peuvent se dé­té­rio­rer si une multitude de col­li­sions se produit. La pro­ba­bi­lité des col­li­sions augmente en effet avec le volume de données. Par ailleurs, un grand nombre de fonctions de hachage ne permet pas de passer à l’ensemble de données suivant ou précédent.

Aller au menu principal