|
Qu'est-ce qu'une bonne fonction de hash ? Quelles sont les propriétés souhaitables pour une fonction de hash ?
Une fonction de hash qui satisfait toutes ces exigences sera dite idéale, à ne pas confondre avec parfaite, qui a une toute autre signification (nous y revenons dans un instant.) Quelles sont donc les pièces constitutives d'une bonne fonction de hash ? Si on regarde la fig. 1. ci-bas, on trouve trois boîtes principales. On a la graine (l'état interne, le seed) une quantité d'information qui maintient la valeur de hash (et autres données nécessaires à son calcul.) Nous trouvons une étape de combinaison où les nouvelles valeurs, typiquement le prochain byte de la clef, sont combinées à l'état interne. Enfin, nous avons une étape de diffusion qui randomise l'état interne de la fonction de hash. La graine, ou une partie de, sera la valeur hashée des données. ![]() Fig. 1. Un diagramme simplifié pour une fonction de hash. C'est un modèle grandement simplifié mais général dans la mesure où chaque « boîte » peut contenir un nombre arbitraire de sous-boîtes. L'état interne, la graine, peut comporter beaucoup plus de bit que la valeur finale; comme l'étape de combinaison peut être elle-même composée de plusieurs strates où, par exemple, le byte est converti à une valeur 32 bits avant d'être combiné à la graine. Enfin, pour bien brouiller les bits, l'étape de diffusion peut employer plusieurs mécanismes pseudo-aléatoires. Il serait simpliste de penser que la fig. 1. donne la grammaire complète des fonctions de hash. Cependant, nous verrons que les fonctions de hash que nous présenterons suivent quand même assez fidèlement ce schéma. Qu'est-ce qu'une fonction de hash parfaite ? Une fonction de hash parfaite est une fonction de hash qui garantit que chaque clef reçoit une valeur hashée différente. Une fonction qui n'est qu'idéale ne garantit pas cela. Garantir une valeur différente pour chaque clef peut être problématique. Si on a un relativement petit espace de clefs (disons, quelques centaines ou quelques milliers tout au plus) on peut contruire en mémoire les tables qui sont nécessaires au calcul de la valeur unique, mais la situation se complique si le nombre de clefs distinctes est très grand, voire infini.
On peut toutefois créer incrémentalement ces tables, mais le gain par rapport à un algorithme plus conventionnel (comme un arbre de recherche binaire) devient moins évident. Nous ne présenterons pas, du moins dans cette version du tutoriel, de fonctions de hash parfaite ni d'algorithme pour en construire une. |