L'article de Wikipedia sur les fonctions de hachage est très bon, mais je vais donner ici mon point de vue.
Qu'est-ce qu'un hash?
"Hash" est vraiment un terme large avec différentes significations formelles dans différents contextes. Il n'y a pas une seule réponse parfaite à votre question. Je vais expliquer le concept général sous-jacent et mentionner quelques-unes des utilisations les plus courantes du terme.
Un "hachage" est une fonction appelée fonction de hachage
qui prend comme objets d'entrée et génère une chaîne ou un nombre. Les objets d'entrée sont généralement des membres de types de données de base tels que des chaînes, des entiers ou de plus grands composés d'autres objets tels que des structures définies par l'utilisateur. La sortie est généralement un nombre ou une chaîne. Le nom "hash" fait souvent référence à cette sortie. Le verbe "hash" signifie souvent "appliquer une fonction de hachage". Les principales propriétés qu'une fonction de hachage devrait avoir sont:h
- Il devrait être facile de calculer et
- Les sorties devraient être relativement petites.
Exemple:
Supposons que nous voulions hacher des nombres compris entre 0 et 999 999 999 et compris entre 0 et 99. Une simple fonction de hachage peut être .h ( x ) = xmod100
Propriétés supplémentaires communes:
Selon le cas d'utilisation, nous pouvons souhaiter que la fonction de hachage satisfasse des propriétés supplémentaires. Voici quelques propriétés supplémentaires communes:
Uniformité : Souvent, nous souhaitons que les objets de hachage soient distincts. De plus, nous voudrons peut-être que les hachages soient "dispersés". Si je veux diviser des objets en 100 compartiments (la sortie de ma fonction de hachage est donc un nombre compris entre 0 et 99), j'espère qu'environ 1/100 des objets atterriront dans le compartiment 0, environ 1/100 dans seau 1, et ainsi de suite.
Résistance aux collisions cryptographiques : parfois, cela va encore plus loin. Par exemple, en cryptographie, je peux souhaiter une fonction de hachage telle qu'il est difficile, d'un point de vue calcul, à un adversaire de trouver deux entrées différentes mappant vers la même sortie.
Compression : je souhaite souvent réduire de façon arbitraire des entrées volumineuses en une sortie de taille constante ou un nombre fixe de compartiments.
Déterminisme : il se peut que je veuille une fonction de hachage dont la sortie ne change pas entre les exécutions, c’est-à-dire que la sortie de la fonction de hachage sur le même objet restera toujours la même. Cela peut sembler en contradiction avec l'uniformité ci-dessus, mais une solution consiste à choisir la fonction de hachage de manière aléatoire une fois, et à ne pas la modifier entre les exécutions.
Quelques applications
Une application courante est dans les structures de données telles qu'une table de hachage, qui permettent d'implémenter des dictionnaires. Ici, vous allouez de la mémoire, par exemple 100 "compartiments"; puis, lorsqu'on vous demande de stocker une paire (clé, valeur) dans le dictionnaire, vous écrivez la clé dans un nombre compris entre 0 et 99, puis vous stockez la paire dans le compartiment correspondant en mémoire. Ensuite, lorsque vous êtes invité à rechercher une clé, vous la divisez en un nombre compris entre 0 et 99 avec la même fonction de hachage, puis vérifiez ce compartiment pour voir si cette clé est présente. Si c'est le cas, vous retournez sa valeur.
Notez que vous pouvez également implémenter les dictionnaires d'une autre manière, par exemple avec un arbre de recherche binaire (si vos objets sont comparables).
Une autre application pratique est la somme de contrôle, qui permet de vérifier que deux fichiers sont identiques (par exemple, le fichier n'était pas corrompu depuis sa version précédente). Comme il est très peu probable que les fonctions de hachage mappent deux entrées sur la même sortie, vous calculez et stockez un hachage du premier fichier, généralement représenté par une chaîne. Ce hachage est très petit, peut-être seulement quelques dizaines de caractères ASCII. Ensuite, lorsque vous obtenez le deuxième fichier, vous le hachez et vérifiez que le résultat est le même. Si c'est le cas, il s'agit presque certainement du même fichier, octet par octet.
Une autre application est la cryptographie, où ces hachages devraient être difficiles à "inverser" - c’est-à-dire que, compte tenu de la sortie et de la fonction de hachage, il devrait être difficile, d’un point de vue calcul, de déterminer l’entrée ou les entrées ayant conduit à cette sortie. Une des utilisations de ceci est pour les mots de passe: Au lieu de stocker le mot de passe lui-même, vous stockez un hachage cryptographique du mot de passe (peut-être avec quelques autres ingrédients). Ensuite, lorsqu'un utilisateur entre un mot de passe, vous calculez son hachage et vérifiez qu'il correspond au hachage correct; Si c'est le cas, vous dites que le mot de passe est correct. (Maintenant, même quelqu'un qui peut rechercher et trouver le hachage enregistré sur le serveur n'a pas la facilité de prétendre être l'utilisateur.) Cette application peut être un cas où la sortie est aussi longue ou plus longue que l'entrée, car l'entrée est si courte.