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:
Quel pourrait être l'algorithme de hachage le plus simple qui garantira la prévention des collisions dans la plupart des cas pratiques.
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?
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?
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 .
Ici est un bon aperçu des fonctions de hachage connues les plus notables.
32bits devrait fonctionner très bien.
Vous devez toujours vérifier les collisions, sauf si vous voulez écrire une table de hachage drôle :)
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
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
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);