web-dev-qa-db-fra.com

Comment écrire une fonction de hachage en C?

Les tables de hachage sont considérées comme le moyen le plus rapide/le meilleur de stocker/récupérer des données.

Ma compréhension d'une table de hachage est la suivante (corrigez-moi si je me trompe ou ajoutez s'il y a quelque chose de plus):

  • UNE Table de hachage n’est rien mais un tableau (simple ou multi-dimensionnel) pour stocker des valeurs.
  • Hachage est le processus pour trouver l'index/emplacement dans le tableau pour insérer/récupérer les données. Vous prenez un élément de données et le transmettez en tant que clé à une fonction de hachage et vous obtenez l'index/l'emplacement où insérer/extraire les données.

J'ai une question:

La fonction de hachage est-elle utilisée pour stocker/récupérer les données DIFFERENT d’une fonction de hachage cryptographique utilisée dans les applications de sécurité pour l’authentification, telles que MD5, HMAC, SHA-1, etc.?

En quoi sont-ils différents?

  • Comment écrire une fonction de hachage en C?
  • Existe-t-il une norme ou des lignes directrices?
  • Comment pouvons-nous nous assurer que la sortie d'une fonction de hachage, c'est-à-dire que l'index n'est pas hors de portée?

Ce serait formidable si vous pouviez mentionner de bons liens pour mieux les comprendre.

26
aks

Un hachage cryptographique insiste sur le fait qu'il est difficile pour quiconque de créer intentionnellement une collision. Pour une table de hachage, l’accent est normalement mis sur l’obtention d’une répartition raisonnable des résultats rapidement . En tant que tels, les deux sont généralement très différents (en particulier, un hachage cryptographique est normalement un lot plus lent).

Pour une fonction de hachage typique, le résultat est limité uniquement par le type - par ex. si elle retourne un size_t, c'est parfaitement correct pour qu'elle retourne any possible size_t. C’est à vous de réduire cette plage de sortie à la taille de votre table (par exemple, en divisant le reste par la taille de votre table, qui doit souvent être un nombre premier).

Par exemple, une fonction de hachage normale assez typique pourrait ressembler à ceci:

// warning: untested code.
size_t hash(char const *input) { 

    const int ret_size = 32;
    size_t ret = 0x555555;
    const int per_char = 7;

    while (*input) { 
        ret ^= *input++;
        ret = ((ret << per_char) | (ret >> (ret_size - per_char));
   }
   return ret;
}

L'idée de base est de faire en sorte que chaque bit de la chaîne d'entrée affecte le résultat et d'avoir (le plus rapidement possible) chaque bit du résultat affecté par au moins une partie de l'entrée. Notez que je ne recommande pas particulièrement cela comme une excellente fonction de hachage. J'essaie seulement d'illustrer certains des principes de base de ce que vous essayez d'accomplir.

11
Jerry Coffin

Bob Jenkins a écrit une description détaillée de son bon, bien que légèrement obsolète, fonction de hachage . L'article contient des liens vers des fonctions de hachage plus récentes et plus performantes, mais la rédaction répond aux préoccupations liées à la création d'une bonne. 

En outre, la plupart des implémentations de tables de hachage utilisent en réalité un tableau de listes liées pour résoudre les conflits. Si vous souhaitez simplement utiliser un tableau, la fonction de hachage doit rechercher les collisions et créer un nouvel index de hachage.

Les fonctions de hachage cryptographiques que vous avez mentionnées pourraient être utilisées comme fonctions de hachage pour une table de hachage , Mais sont beaucoup plus lentes que les fonctions de hachage conçues pour une table de hachage. La vitesse facilite les attaques par force brute.

4
RossFabricant

Les objectifs de conception sont différents.

Avec fonctions de hachage cryptographiques vous voulez, par exemple, que les fonctions de hachage et de hachage ne puissent pas être utilisées pour déterminer les données d'origine ou toute autre donnée qui produirait le même hachage.

Les fonctions de hachage utilisées avec les tables de hachage et les autres structures de données n'ont pas besoin de telles propriétés de sécurité. Il suffit souvent que la fonction de hachage soit rapide et qu'elle répartisse le jeu d'entrées de manière uniforme dans l'ensemble des hachages possibles (pour éviter les regroupements/collisions inutiles).

0
Anssi