Conversion du résultat MD5 en un entier en C

Mon objective est d’utiliser le résultat d’un résultat MD5 pour indexer une table de hachage. Je veux effectuer une opération Modulo dessus pour trouver le logement approprié dans la table. J’ai essayé de le présenter comme un type long, long et non signé. Lorsque j’ai imprimé le résultat, j’ai obtenu un numéro différent à chaque fois pour le même hachage MD5. Le hachage MD5 est initialement un caractère non signé *. Quelqu’un peut-il me dire ce que je fais mal?

Voici ma fonction:

int get_fp_slot(unsigned char * fingerprint, int size) { return (unsigned long long)fingerprint % size; } 

    Un hachage MD5 est un nombre de 128 bits. Donc, pour de meilleures performances, vous devriez probablement garder tous les 128 bits.

    Étant donné que votre fonction prend le hachage de 128 bits comme chaîne de caractères, vous devez parsingr cette chaîne dans une série de 4 entiers. Votre chaîne ressemble probablement à ceci:

     79054025255fb1a26e4bc422aef54eb4 

    C’est une chaîne hexadécimale de 32 octets. Si tel est le cas, vous extrayez la version binary comme ceci:

     int v1, v2, v3, v4; sscanf( &fingerprint[0], "%x", &v1 ); sscanf( &fingerprint[8], "%x", &v2 ); sscanf( &fingerprint[16], "%x", &v3 ); sscanf( &fingerprint[24], "%x", &v4 ); 

    Ce que vous faites maintenant dépend vraiment de la qualité de votre hash. Si vous avez vraiment besoin d’utiliser un nombre 32 bits, il vous suffit de XOR tous ces chiffres ensemble:

     int hash = v1 ^ v2 ^ v3 ^v4; 

    Vous lancez le pointeur, c’est-à-dire l’ adresse du hachage. Bien sûr, cette adresse n’est pas liée à la valeur du hachage.

    Comment résoudre ce problème dépend de ce que vous voulez. Vous pouvez par exemple utiliser les 16 derniers octets du hachage et les parsingr sur une unsigned long long ,

     // sanity and error checking omitted for brevity int get_fp_slot(unsigned char *fingerprint, int size) { size_t len = strlen(fingerprint); size_t offset = len < 16 ? 0 : len-16; unsigned long long hash_tail = strtoull(fingerprint + offset,NULL,16); return hash_tail % size; } 

    ou faire le modulo progressivement

     // uses a helper hex_val that converts a hexadecimal digit to the integer it signifies int get_fp_slot(unsigned char *fingerprint, int size) { unsigned long long hash_mod = 0; while(*fingerprint) { hash_mod = (16*hash_mod + hex_val(*fingerprint)) % size; ++fingerprint; } return hash_mod; } 

    Dans votre code, vous convertissez le pointeur lui-même, pas les octets qui forment la valeur MD5!

    Un MD5 a 128 bits, soit 16 octets. En supposant que votre type long long soit de 64 bits (8 octets), vous pouvez le représenter sous la forme de deux valeurs long long , puis définissez-les XOR pour obtenir le hachage. Ou, si vous préférez, vous pouvez simplement en choisir un… La qualité du hachage est probablement similaire.

    Vous ne le dites pas, mais je suppose que votre empreinte digitale est un pointeur sur un tableau de 16 octets avec la valeur MD5. Ensuite:

     unsigned long long a = *(unsigned long long*)fingerprint; unsigned long long b = *(unsigned long long*)(fingerprint + 8); return a ^ b; 

    Notez que les valeurs de a et b dépendent de l’endianité de votre machine. Cela n’a pas d’importance tant que vous n’envoyez pas les hachages à une architecture différente.