Fonction de hachage parfait
En informatique, une fonction de hachage parfait h pour un ensemble S est une fonction de hachage qui associe des éléments distincts de S à un ensemble de m entiers, sans collisions. En termes mathématiques, c'est une fonction injective.
Des fonctions de hachage parfait peuvent ĂȘtre utilisĂ©es pour implĂ©menter une table de correspondance avec un temps d'accĂšs constant dans le pire des cas. Une fonction de hachage parfait peut, comme toute fonction de hachage, ĂȘtre utilisĂ©e pour implĂ©menter des tables de hachage, avec l'avantage qu'aucun mĂ©canisme de rĂ©solution de collisions ne doit ĂȘtre implĂ©mentĂ©. De plus, si les clĂ©s ne sont pas des donnĂ©es utiles et si l'on sait que les clĂ©s interrogĂ©es seront valides, les clĂ©s n'ont pas besoin d'ĂȘtre stockĂ©es dans la table de correspondance, ce qui permet d'Ă©conomiser de l'espace mĂ©moire.
Un inconvĂ©nient des fonctions de hachage parfait est que S doit ĂȘtre connu pour la construction de la fonction de hachage parfait. Les fonctions de hachage parfait non dynamiques doivent ĂȘtre reconstruites si S change. Pour changer frĂ©quemment S, des fonctions de hachage parfait dynamiques peuvent ĂȘtre utilisĂ©es au prix d'un espace supplĂ©mentaire. L'espace requis pour stocker la fonction de hachage parfait est en O(n).
Les paramĂštres de performance importants pour les fonctions de hachage parfait sont le temps d'Ă©valuation, qui doit ĂȘtre constant, le temps de construction et la taille mĂ©moire de la reprĂ©sentation.
Applications
Une fonction de hachage parfait avec des valeurs dans une plage limitĂ©e peut ĂȘtre utilisĂ©e pour des opĂ©rations de recherche efficaces, en plaçant les clĂ©s de S (ou d'autres valeurs associĂ©es) dans une table de correspondance indexĂ©e par les valeurs de sortie de la fonction. On peut alors tester si une clĂ© est prĂ©sente dans S, ou rechercher une valeur associĂ©e Ă cette clĂ©, en la recherchant dans sa cellule du tableau. Chacune de ces recherches prend un temps constant dans le pire des cas. Avec un hachage parfait, les donnĂ©es associĂ©es peuvent ĂȘtre lues ou Ă©crites avec un seul accĂšs Ă la table.
Performance des fonctions de hachage parfait
Les paramĂštres importants de performance pour un hachage parfait sont la taille de reprĂ©sentation, le temps d'Ă©valuation, le temps de construction et, en outre, le ratio oĂč m est le nombre de cellules, et n le nombre d'Ă©lĂ©ments dans la structure de donnĂ©es. Le temps d'Ă©valuation peut ĂȘtre aussi rapide que O(1), ce qui est optimal[1]. Le temps de construction est d'au moins O(n), car chaque Ă©lĂ©ment de S doit ĂȘtre pris en compte et S contient n Ă©lĂ©ments. Cette borne infĂ©rieure peut ĂȘtre atteinte en pratique[1].
La borne inférieure de la taille mémoire de représentation de la fonction de hachage dépend de m et n. Soit m = (1+Δ) n et h une fonction de hachage parfait. Une bonne approximation de la borne inférieure est bits par élément. Pour un hachage parfait minimal, i.e. pour Δ = 0, la borne inférieure est bits par élément.
Construction
Une fonction de hachage parfait pour un ensemble spĂ©cifique S qui peut ĂȘtre Ă©valuĂ© en temps constant, et avec des valeurs dans une petite plage, peut ĂȘtre trouvĂ©e par un algorithme probabiliste dans un nombre d'opĂ©rations qui est proportionnel Ă la taille de S. La construction originale de Fredman, KomlĂłs & SzemerĂ©di (1984) utilisent un schĂ©ma Ă deux niveaux pour envoyer un ensemble S de n Ă©lĂ©ments sur une plage de O(n) indices, puis envoyer chaque indice sur une plage de valeurs de hachage. Le premier niveau de leur construction choisit un grand nombre premier p (plus grand que la taille de l'univers Ă partir duquel S est tirĂ©), et un paramĂštre k, et fait correspondre chaque Ă©lĂ©ment x de S Ă l'indice
Si k est choisi au hasard, cette Ă©tape est susceptible d'avoir des collisions, mais le nombre d'Ă©lĂ©ments ni qui sont simultanĂ©ment envoyĂ©s au mĂȘme indice i a de grandes chances d'ĂȘtre petit. Le deuxiĂšme niveau de leur construction attribue des plages disjointes d'entiers de taille O(ni2) Ă chaque indice i. Il utilise un deuxiĂšme ensemble de fonctions modulaires linĂ©aires, une pour chaque index i, pour mapper chaque membre x de S dans la plage associĂ©e Ă g(x).
Comme le montrent Fredman, KomlĂłs & SzemerĂ©di (1984)[2], il existe un choix du paramĂštre k tel que la somme des longueurs des plages pour les n valeurs diffĂ©rentes de g(x) soit en O(n). De plus, pour chaque valeur de g(x), il existe une fonction modulaire linĂ©aire qui envoie le sous-ensemble correspondant de S dans la plage associĂ©e Ă cette valeur.La valeur de k et les fonctions de second niveau pour chaque valeur de g(x), peuvent ĂȘtre trouvĂ©es en temps polynomial en choisissant des valeurs au hasard jusqu'Ă en trouver une qui fonctionne.
La fonction de hachage elle-mĂȘme nĂ©cessite un espace de stockage O(n) pour stocker k, p et toutes les fonctions modulaires linĂ©aires de second niveau. Le calcul de la valeur de hachage d'une clĂ© donnĂ©e x peut ĂȘtre effectuĂ© en temps constant en calculant g(x), en recherchant la fonction de second niveau associĂ©e Ă g(x) et en appliquant cette fonction Ă x. Une version modifiĂ©e de ce schĂ©ma Ă deux niveaux avec un plus grand nombre de valeurs au niveau supĂ©rieur peut ĂȘtre utilisĂ©e pour construire une fonction de hachage parfait qui envoie S dans une plage plus petite de longueur n + o(n).
Une mĂ©thode plus rĂ©cente pour construire une fonction de hachage parfait est dĂ©crite par Belazzougui, Botelho & Dietzfelbinger (2009)[1] comme "hacher, dĂ©placer et compresser". Ici, une fonction de hachage de premier niveau g est Ă©galement utilisĂ©e pour envoyer des Ă©lĂ©ments sur une plage de r entiers. Un Ă©lĂ©ment x â S est stockĂ© dans le Bucket Bg(x).
Ensuite, par ordre décroissant de taille, les éléments de chaque bucket sont hachés par une fonction de hachage d'une séquence de fonctions de hachage entiÚrement aléatoires indépendantes (Ί1, Ί2, Ί3, ...), en commençant par Ί1. Si la fonction de hachage ne produit aucune collision pour le bucket et que les valeurs résultantes ne sont pas encore occupées par d'autres éléments d'autres buckets, la fonction est choisie pour ce bucket. Si ce n'est pas le cas, la fonction de hachage suivante de la séquence est testée.
Pour Ă©valuer la fonction de hachage parfait h(x), il suffit de sauvegarder le l'image Ï de l'indice de compartiment g(x) sur la fonction de hachage correcte dans la sĂ©quence, ce qui donne h(x) = ΊÏ(g(x)).
Enfin, pour rĂ©duire la taille de la reprĂ©sentation, les ( Ï(i))0 †i < r sont compressĂ©s sous une forme qui permet toujours l'Ă©valuation en O(1).
Cette approche nécessite un temps linéaire en n pour la construction, et permet un temps d'évaluation constant. La taille de la représentation est en O(n), et dépend de la plage atteinte. Par exemple, avec m = 1.23n Belazzougui, Botelho & Dietzfelbinger (2009) ont atteint une taille de représentation comprise entre 3,03 bits/clé et 1,40 bits/clé pour leur exemple donné de 10 millions d'entrées, les valeurs inférieures nécessitant un temps de calcul plus élevé. La limite inférieure de l'espace dans ce scénario est de 0,88 bit/clé.
Pseudocode
l'algorithme de hachage, de dĂ©placement et de compression est (1) Diviser S en paquets Bi := gâ1({i})â©S,0 †i < r (2) Trier les paquets Bi par ordre dĂ©croissant selon la taille |Bi| (3) Initialiser le tableau T[0...m-1] avec des 0 (4) pour tout iââ[r], dans l'ordre de (2), faire (5) pour lâââ1,2, ... (6) rĂ©pĂ©ter la construction de KiâââΊl(x)|xââ Bi} (6) tant que |Ki|â |Bi| ou Kiâ©{j|T[j]=1}â ââ (7) soit Ï(i):= le l rĂ©ussi (8) pour tout jâââKi laisse T[j]:=â1 (9) Transformer (Ïi)0â€i<r sous forme compressĂ©e, en conservant l'accĂšs O(1).
Limites inférieures en espace
Le stockage de la fonction de Fredman, Komlós & Szemerédi (1984)[2] en O(n) est quasi optimal : toute fonction de hachage parfait calculable en temps constant nécessite au moins un nombre de bits proportionnel à la taille de S.
Pour les fonctions de hachage parfait minimal, la borne inférieure théorique de l'espace de stockage est
bits par clé.
Pour les fonctions de hachage parfait, on définit Δ tel que la taille de la plage de h est m = (1+Δ) n. Avec la formule donnée par Belazzougui, Botelho & Dietzfelbinger (2009)[1] et pour un univers dont la taille |U| = u tend vers l'infini, le minorant de l'espace est
bits par clé, moins log(n) bits au total.
Extensions
Identité de l'adresse mémoire
Un exemple trivial mais omniprĂ©sent de hachage parfait est implicite dans l'adresse mĂ©moire (virtuelle) d'un ordinateur. Ătant donnĂ© que chaque octet de mĂ©moire virtuelle est un emplacement de stockage distinct, unique et directement adressable, la valeur de l'adresse de dĂ©part de tout objet stockĂ© en mĂ©moire peut ĂȘtre considĂ©rĂ©e comme un hachage parfait de facto de cet objet dans toute la plage d'adresses mĂ©moire[3].
Hachage parfait dynamique
L'utilisation d'une fonction de hachage parfait est prĂ©fĂ©rable dans les situations oĂč il existe un grand ensemble frĂ©quemment interrogĂ©, S, qui est rarement mis Ă jour. En effet, toute modification de l'ensemble S peut rendre le hachage non parfait pour l'ensemble modifiĂ©. Les solutions qui mettent Ă jour la fonction de hachage chaque fois que l'ensemble est modifiĂ© sont connues sous le nom de hachage parfait dynamique, mais ces mĂ©thodes sont relativement compliquĂ©es Ă mettre en Ćuvre.
Fonction de hachage parfait minimale
Une fonction de hachage parfait minimal est une fonction de hachage parfait qui envoie n clĂ©s sur n entiers consĂ©cutifs - gĂ©nĂ©ralement les nombres de 0 Ă n â 1 ou de 1 Ă n. Une maniĂšre plus formelle d'exprimer cela est la suivante : Soient j et k des Ă©lĂ©ments d'un ensemble fini S. Alors h est une fonction de hachage parfait minimale si et seulement si h(j) = h(k) implique j = k ( injectivitĂ© ) et il existe un entier a tel que la plage de h soit a..a + |S| â 1. Il a Ă©tĂ© prouvĂ© qu'un schĂ©ma de hachage parfait minimal Ă usage gĂ©nĂ©ral nĂ©cessite au moins lg e â 1.44 bits/clĂ©. Bien que cette limite d'espace ait Ă©tĂ© atteinte par des travaux thĂ©oriques, en pratique, les schĂ©mas de hachage parfait minimal les plus connus nĂ©cessitent environ 1,56 bits/clĂ© si on leur donne suffisamment de temps.
hachage k-parfait
Une fonction de hachage est k -parfait si au plus k Ă©lĂ©ments de S sont envoyĂ©s sur la mĂȘme valeur dans la plage. L'algorithme "hacher, dĂ©placer et compresser" peut ĂȘtre utilisĂ© pour construire des fonctions de hachage k -parfait en autorisant jusqu'Ă k collisions. Les modifications nĂ©cessaires pour y parvenir sont minimes et sont soulignĂ©es dans le pseudocode adaptĂ© ci-dessous :
(4) pour tout iââ[r], dans l'ordre de (2), faire
(5) pour lâââ1,2, ...
(6) rĂ©pĂ©ter la formation de KiâââΊl(x)|xâââB je }
(6) jusqu'Ă |K i |=|B i | et Kiâ©{j| T[j]=k }=ââ
(7) soit Ï(i):= le l rĂ©ussi
(8) pour tout jâââKi fixer T[j] â T[j]+1
Préservation de la commande
Une fonction de hachage parfait minimal F prĂ©serve l'ordre si les clĂ©s sont donnĂ©es dans un certain ordre a1, a2, ..., an et pour toutes les clĂ©s aj et ak, j < k implique F(aj) < F(ak). Dans ce cas, la valeur de la fonction est simplement la position de chaque clĂ© dans l'ordre triĂ© de toutes les clĂ©s. Une implĂ©mentation simple des fonctions de hachage parfait minimal prĂ©servant l'ordre avec un temps d'accĂšs constant consiste Ă utiliser une fonction de hachage parfait (ordinaire) ou un hachage coucou pour stocker une table de recherche des positions de chaque clĂ©. Si les clĂ©s Ă hacher sont elles-mĂȘmes stockĂ©es dans un tableau triĂ©, il est possible de stocker un petit nombre de bits supplĂ©mentaires par clĂ© dans une structure de donnĂ©es qui peut ĂȘtre utilisĂ©e pour calculer rapidement des valeurs de hachage. Les fonctions de hachage parfait minimal prĂ©servant l'ordre nĂ©cessitent nĂ©cessairement Ω(n log n) bits pour ĂȘtre reprĂ©sentĂ©es.
Constructions connexes
Une alternative simple au hachage parfait, qui permet Ă©galement des mises Ă jour dynamiques, est le hachage cuckoo. Ce schĂ©ma envoie les clĂ©s Ă deux emplacements ou plus dans une plage (contrairement au hachage parfait qui envoie chaque clĂ© Ă un seul emplacement) mais le fait de telle maniĂšre que les clĂ©s peuvent ĂȘtre attribuĂ©es une Ă une aux emplacements auxquels elles ont Ă©tĂ© envoyĂ©es. Les recherches avec ce schĂ©ma sont plus lentes, car plusieurs emplacements doivent ĂȘtre vĂ©rifiĂ©s, mais prennent nĂ©anmoins un temps constant dans le pire des cas.
Notes et références
- (en) Djamal Belazzougui, Fabiano C. Botelho et Martin Dietzfelbinger, « AlgorithmsâESA 2009: 17th Annual European Symposium, Copenhagen, Denmark, September 7-9, 2009, Proceedings », Lecture Notes in Computer Science,â (DOI 10.1007/978-3-642-04128-0_61, lire en ligne)
- (en) Michael L. Fredman, JĂĄnos KomlĂłs et Endre SzemerĂ©di, « Storing a Sparse Table with 0 (1) Worst Case Access Time », Journal of the ACM, vol. 31, no 3,â , p. 538â544 (ISSN 0004-5411 et 1557-735X, DOI 10.1145/828.1884, lire en ligne, consultĂ© le )
- Witold Litwin, Tadeusz Morzy et Gottfried Vossen, Advances in Databases and Information Systems, Springer Science+Business Media, (ISBN 9783540649243, lire en ligne), p. 254
Lectures complémentaires
- Richard J. Cichelli. Fonctions de hachage parfaites minimales simplifiées, Communications de l'ACM, Vol. 23, numéro 1, janvier 1980.
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest et Clifford Stein. Introduction aux algorithmes, troisiĂšme Ă©dition. Presse du MIT, 2009. (ISBN 978-0262033848). Section 11.5 : Hachage parfait, p. 267, â.
- Fabiano C. Botelho, Rasmus Pagh et Nivio Ziviani. " Hachage parfait pour les applications de gestion de données ".
- Fabiano C. Botelho et Nivio Ziviani. "Hachage externe parfait pour les trÚs grands ensembles de clés". 16th ACM Conference on Information and Knowledge Management (CIKM07), Lisbonne, Portugal, novembre 2007.
- Djamal Belazzougui, Paolo Boldi, Rasmus Pagh et Sebastiano Vigna. "Hachage parfait minimal monotone: recherche d'une table triée avec des accÚs O (1)". Dans Actes du 20e symposium annuel ACM-SIAM sur les mathématiques discrÚtes (SODA), New York, 2009. Presse ACM.
- Marshall D. Brain et Alan L. Tharp. "Hachage presque parfait de grands ensembles de mots". LogicielâPratique et expĂ©rience, vol. 19(10), 967-078, octobre 1989. John Wiley et fils.
- Douglas C. Schmidt, GPERF : un générateur de fonction de hachage parfait, rapport C++, SIGS, vol. 10, no 10, novembre/décembre 1998.
Liens externes
- gperf est un générateur de hachage parfait Open Source C et C ++ (trÚs rapide, mais ne fonctionne que pour de petits ensembles)
- Hachage parfait minimal (algorithme bob) par Bob Jenkins
- cmph : C Minimal Perfect Hashing Library, implémentations open source pour de nombreux hachages parfaits (minimaux) (fonctionne pour les grands ensembles)
- Sux4J : hachage parfait minimal monotone open source en Java
- MPHSharp : méthodes de hachage parfaites en C#
- BBHash : fonction de hachage parfaite minimale en C++ avec en-tĂȘte uniquement
- Perfect::Hash, gĂ©nĂ©rateur de hachage parfait en Perl qui crĂ©e du code C. A une section "art antĂ©rieur" qui vaut la peine d'ĂȘtre consultĂ©e.