2010-10-14 18 views
9

sto lì cercando di fare un'implementazione tabella hash personalizzato in C. è una funzione hash MD5/SHA1 già nella libreria GNU o devo usare una libreria esterna per questo?Esiste una funzione di hash glibc?

Ecco po 'quello che sto cercando:

int hashValue; 

hashValue = MD5_HASH(valToHash); 
+3

Anche se ci fosse, si avrebbe anche per passare un parametro di lunghezza. – Blindy

risposta

3

ci sono poche, semplici versioni di fiducia disponibili - Ho un paio di fonti del digest per R. Ecco quello che ho scritto nel file di descrizione:

Descrizione: Il pacchetto digest fornisce funzioni per la creazione di `digest hash' di arbitrarie R oggetti utilizzando il MD5, SHA-1, SHA-256 e crc32 algoritmi che consentono un facile confronto degli oggetti linguaggio R. L'algoritmo MD5 da Ron Rivest è specificato in RFC 1321, SHA-1 e SHA-256 algoritmi sono specificati in FIPS-180-1 e 180-2 FIPS, e l'algoritmo crc32 descritto in
ftp://ftp.rocksoft.com/cliens/rocksoft/papers/crc_v3.txt. MD5, SHA-1 e SHA-256, questo pacchetti utilizza piccole standalone implementazioni che sono stati forniti da Christophe Devine. Per crc32, viene utilizzato il codice dalla libreria zlib.

Penso che un po 'del codice di Christophe non sia più in cr0.net, ma le ricerche dovrebbero portarti a diversi altri progetti che lo incorporano. Le sue intestazioni dei file erano abbastanza chiare:

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

e il suo codice corrisponde l'uscita di riferimento.

3

A meno che non si dispone già di una buona ragione per usare MD5, si potrebbe voler riconsiderare. Ciò che rende una "buona" funzione di hash in una tabella hash dipende molto da ciò che stai cercando di realizzare. Si consiglia di leggere i commenti in Python di dictobject.c per vedere i tipi di Compromessi altri hanno fatto.

2

Glibc's crypt() utilizza un algoritmo basato su MD5 se sale inizia con $ 1 $. Ma dal momento che hai detto che stai per eseguire un'implementazione della tabella hash, forse l'hash Jenkins sarebbe più appropriato.

2

La libreria OpenSSL dispone di tutte le routine di crittografia che si potrebbero desiderare, inclusi gli hash crittografici.

4

Per una tabella hash, non è necessaria la forza crittografica, solo buone proprietà di randomizzazione. Le funzioni hash crittografiche spezzate (come MD5) vanno bene per questo, ma potresti voler usare MD4, che è sia più veloce che più semplice, al punto che potresti semplicemente includere un'implementazione direttamente nel tuo codice. Non è difficile riscriverlo dalle specifiche (e dato che vuoi solo una funzione per una tabella hash, non è davvero un problema se a un certo punto ti sbagli). Spina senza vergogna: c'è un'implementazione C ottimizzata di MD4 in sphlib.

+0

Sono contento che non abbiate vergogna per la vostra spina; So che questo è un vecchio post, ma questa è comunque una grande libe autonoma. – Leo

1

gcrypt e OpenSSL possono fare MD5, SHA e altri hash Ecco un esempio con 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 è un algoritmo noncryptographic veloce che è possibile utilizzare.

una buona velocità di comparazione mormorare contro altri algoritmi si possono trovare in questa discussione https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

Una possibile implementazione: https://github.com/PeterScott/murmur3

Esempio:

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

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