AccueilđŸ‡«đŸ‡·Chercher

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.

Une fonction de hachage parfait pour les quatre noms John Smith, Lisa Smith, Sam Doe et Sandra Dee.
Une fonction de hachage parfait minimal pour les quatre noms John Smith, Lisa Smith, Sam Doe et Sandra Dee.

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

  1. (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)
  2. (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 )
  3. 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

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.
Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.