web-dev-qa-db-fra.com

Une fonction de hachage minimale pour C?

Je ne peux pas utiliser boost: hash car je dois m'en tenir à C et ne peux pas utiliser C++.

Mais, j'ai besoin de hacher un grand nombre (10K à 100k) de chaînes de jetons (longueur de 5 à 40 octets) afin que la recherche dans celles-ci soit la plus rapide.

MD5, SHA1 ou toute fonction de hachage longue semble trop lourde pour une tâche simple, je ne fais pas de cryptographie. De plus, il y a le coût de stockage et de calcul.

Par conséquent ma question:

  1. Quel pourrait être l'algorithme de hachage le plus simple qui garantira la prévention des collisions dans la plupart des cas pratiques.

  2. Combien de bits utiliser pour la valeur de hachage? Je développe pour des systèmes 32 bits. Est-ce que l'algorithme de hachage en Perl/Python utilise également des hachages 32 bits? Ou dois-je passer à 64?

  3. Concernant l'implémentation des tables de hachage dans les langages de script courants: l'implémentation vérifie-t-elle les collisions ou puis-je éviter complètement cette partie?

41
CDR

Vous pouvez trouver une bonne fonction de hachage (et rapide) et une lecture intéressante sur http://www.azillionmonkeys.com/qed/hash.html

La seule fois où vous ne devriez pas vérifier les collisions, c'est si vous utilisez un hachage parfait - une bonne table de recherche à l'ancienne, comme gperf .

23
gnud
  1. Ici est un bon aperçu des fonctions de hachage connues les plus notables.

  2. 32bits devrait fonctionner très bien.

  3. Vous devez toujours vérifier les collisions, sauf si vous voulez écrire une table de hachage drôle :)

11
arul

Une fonction de hachage générale pour recherche de table de hachage . Il spécifie NE PAS utiliser à des fins cryptographiques , mais puisque vous avez spécifié que vous n'avez aucune intention pour cela, alors vous devriez être d'accord.

Il comprend un aperçu des fonctions de hachage à essayer

8
TStamper

Si vous utilisez un système posix et que vous vous en tenez au C simple, j'utiliserais simplement ce que le système a déjà à offrir. man 3 hcreate vous offre tous les détails ou vous pouvez trouver une version en ligne ici http://linux.die.net/man/3/hcreate

5
amo-ej1

Essayez Adler32 pour les chaînes longues ou Murmur2 pour les chaînes courtes.

2
Dru G

xxhash est une option assez rapide et facile. Un code simple utiliserait XXH32 fonction:

unsigned int XXH32 (const void* input, int len, unsigned int seed);

Il s'agit d'un hachage 32 bits. Puisque len est int, pour des données plus volumineuses plus de 2^31-1 octets les utilisent:

void*         XXH32_init   (unsigned int seed);
XXH_errorcode XXH32_update (void* state, const void* input, int len);
unsigned int  XXH32_digest (void* state);
1
Majid Azimi