2010-10-14 11 views
9

Szukam niestandardowej implementacji tablic asocjacyjnych w C. Czy istnieje funkcja haszująca MD5/SHA1 już w bibliotece GNU, czy też muszę w tym celu korzystać z biblioteki zewnętrznej?Czy istnieje funkcja skrótu glibc?

Oto trochę co szukam:

int hashValue; 

hashValue = MD5_HASH(valToHash); 
+3

Nawet jeśli nie było, to by mieć aby przekazać również parametr długości. – Blindy

Odpowiedz

3

Istnieje kilka zaufanych, proste wersje - Mam kilka w źródłach w digest dla R. Oto co napisałem w pliku Opis:

Opis: Pakiet Digest udostępnia funkcje pozwalające na tworzenie z `trawienia hash” arbitralnych R obiektów przy użyciu MD5, SHA-1, SHA-256 i algorytmy crc32 pozwalające na łatwe porównywanie obiektów języka R z . Algorytm MD5 Ron Rivest jest określony w specyfikacji RFC 1321, SHA-1 i algorytm SHA-256 podano w FIPS 180-1 i FIPS 180-2 i algorytm CRC32 jest opisane w
ftp://ftp.rocksoft.com/cliens/rocksoft/papers/crc_v3.txt. W przypadku pakietów md5, sha-1 i sha-256 pakiety korzystają z niewielkich autonomicznych implementacji dostarczonych przez: Christophe Devine. Dla crc32 używany jest kod z biblioteki zlib.

Wydaje mi się, że niektóre z kodów Christophe'a nie znajdują się już na cr0.net, ale wyszukiwania powinny doprowadzić do kilku innych projektów, które go zawierają. Jego nagłówki plików były całkiem jasne:

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

i jego kod pasuje do wyjścia referencyjnego.

3

Jeśli nie masz już uzasadnionego powodu używania MD5, możesz rozważyć ponowne rozpatrzenie. Co sprawia, że ​​funkcja "dobrego" skrótu w tabeli mieszającej jest dość zależna od tego, co próbujesz osiągnąć. Możesz przeczytać komentarze w Pythonie dictobject.c, aby zobaczyć rodzaje kompromisów, które zrobili inni.

2

Glibc używa crypt() używa algorytmu opartego na MD5, jeśli sól zaczyna się od $ 1 $. Ale odkąd wspomniałeś, że zamierzasz wprowadzić implementację tabeli mieszania, być może hasz Jenkinsa byłby bardziej odpowiedni.

2

Biblioteka OpenSSL zawiera wszystkie procedury kryptograficzne, jakie kiedykolwiek można chcieć, w tym skróty kryptograficzne.

4

Dla tabeli skrótów nie potrzebujesz siły kryptograficznej, tylko dobre właściwości losowania. Zepsute kryptograficzne funkcje mieszające (takie jak MD5) są do tego odpowiednie, ale możesz użyć MD4, która jest zarówno szybsza, jak i prostsza, do tego stopnia, że ​​możesz po prostu dołączyć implementację bezpośrednio do kodu. Nie jest trudno przepisać go ze specyfikacji (a ponieważ chcesz mieć tylko funkcję dla tabeli mieszania, nie jest to naprawdę problem, jeśli w pewnym momencie się pomylisz). Bezwstydna wtyczka: istnieje zoptymalizowana implementacja C MD4 w sphlib.

+0

Cieszę się, że nie miałeś wstydu na wtyczce; Wiem, że to stary post, ale wciąż jest to świetna autonomiczna biblioteka. – Leo

1

gcrypt i OpenSSL można zrobić MD5, SHA i inne skróty oto przykład z 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 to szybka noncryptographic algorytm, który można użyć.

Dobrym prędkość komparacji z szemrania przeciwko algorytmów można znaleźć w tym wątku https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

Jednym z możliwych rozwiązań: https://github.com/PeterScott/murmur3

Przykład:

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

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