2010-10-14 21 views
9

Je cherche à faire une implémentation de table de hachage personnalisée en C. Existe-t-il déjà une fonction de hachage MD5/SHA1 dans la bibliothèque GNU ou dois-je utiliser une bibliothèque externe pour cela?Existe-t-il une fonction de hachage glibc?

Voici un peu ce que je cherche:

int hashValue; 

hashValue = MD5_HASH(valToHash); 
+3

Même s'il y avait, vous auriez pour passer un paramètre de longueur aussi. – Blindy

Répondre

3

Il y a quelques versions simples de confiance, disponibles - J'ai quelques-unes dans les sources du digest pour R. Voici ce que je l'ai écrit dans le fichier DESCRIPTION:

Description: Le package condensé fournit des fonctions pour la création de `digestions « hachage d'objets quelconques R en utilisant le md5, sha-1, sha-256 et les algorithmes crc32 permettant une comparaison facile d'objets en langage R. L'algorithme MD5 par Ron Rivest est spécifié dans la RFC 1321, les algorithmes SHA-1 et SHA-256 sont exprimées en FIPS 180-1 et FIPS-180-2, et l'algorithme de CRC32 est décrite dans
ftp://ftp.rocksoft.com/cliens/rocksoft/papers/crc_v3.txt. Pour md5, sha-1 et sha-256, ces packages utilisent de petites implémentations autonomes fournies par Christophe Devine. Pour crc32, le code de la bibliothèque zlib est utilisé.

Je pense qu'une partie du code de Christophe n'est plus sur cr0.net, mais les recherches devraient vous mener à plusieurs autres projets qui l'intègrent. Ses en-têtes de fichier étaient assez clairs:

/*             
* FIPS-180-1 compliant SHA-1 implementation, 
* by Christophe Devine <[email protected]>; 
* this program is licensed under the GPL. 
*/  

et son code correspond à la sortie de référence.

3

Sauf si vous avez déjà une bonne raison d'utiliser MD5, vous pouvez vouloir reconsidérer. Qu'est-ce qui rend une "bonne" fonction de hachage dans une table de hachage dépend assez de ce que vous essayez d'accomplir. Vous voudrez peut-être lire les commentaires dans le dictobject.c de Python pour voir les sortes de compromis que d'autres ont faits.

2

Le crypt() de Glibc utilise un algorhytm basé sur MD5 si le sel commence avec $ 1 $. Mais puisque vous mentionnez que vous allez faire une implémentation de table de hachage, peut-être que Jenkins serait plus approprié.

2

La bibliothèque OpenSSL possède toutes les routines de chiffrement que vous pourriez souhaiter, y compris les hachages cryptographiques.

4

Pour une table de hachage, vous n'avez pas besoin de force cryptographique, seulement de bonnes propriétés de randomisation. Les fonctions de hachage cryptographique brisées (comme MD5) sont bien pour cela, mais vous pouvez utiliser MD4, qui est à la fois plus rapide et plus simple, au point que vous pourriez simplement inclure une implémentation directement dans votre code. Il n'est pas difficile de le réécrire à partir de la spécification (et puisque vous ne voulez qu'une fonction pour une table de hachage, ce n'est pas vraiment un problème si vous vous trompez à un moment donné). Plug impudique: il existe une implémentation C optimisée de MD4 dans sphlib.

+0

Je suis content que vous n'ayez pas eu honte de votre prise; Je sais que c'est un vieux post, mais c'est toujours une bonne librairie autonome. – Leo

1

gcrypt et OpenSSL peuvent faire MD5, SHA et d'autres hash est ici un exemple avec libgcrypt:

#include <gcrypt.h> 
#include <stdio.h> 

// compile gcc md5_test.c -lgcrypt 

int main(int argc, char *argv[]) 
{ 
     unsigned char digest[16]; 
     char digest_ascii[32+1] = {0,}; 
     int digest_length = gcry_md_get_algo_dlen (GCRY_MD_MD5); 
     int i; 
     printf("hashing=%s len=%d\n", argv[1], digest_length); 
     gcry_md_hash_buffer(GCRY_MD_MD5, digest, argv[1], strlen(argv[1])); 

     for (i=0; i < digest_length; i++) { 
       sprintf(digest_ascii+(i*2), "%02x", digest[i]); 
     } 
     printf("hash=%s\n", digest_ascii); 
} 

`

0

Murmur3 est un algorithme rapide que vous non-cryptographiques pouvez utiliser.

Une comparation bonne vitesse de souffle par rapport aux autres algorithmes se trouvent dans ce fil https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

Une mise en œuvre possible: https://github.com/PeterScott/murmur3

Exemple:

uint32_t hash; 
uint32_t seed = 42; 
char* input = "HelloWorld"; 

MurmurHash3_x86_32(input, strlen(input), seed, &hash); 
printf("x86_32: %08x\n", hash);