2010-10-14 45 views
9

Tôi đang tìm cách thực hiện bảng băm tùy chỉnh trong C. Có hàm băm MD5/SHA1 đã có trong thư viện GNU hoặc tôi có phải sử dụng thư viện bên ngoài cho điều này không?Có hàm băm glibc không?

Dưới đây là kinda những gì tôi đang tìm kiếm:

int hashValue; 

hashValue = MD5_HASH(valToHash); 
+3

Thậm chí nếu có, bạn phải để truyền tham số chiều dài. – Blindy

Trả lời

3

Có một vài tin cậy, phiên bản đơn giản có sẵn - Tôi có một vài trong nguồn của digest cho R. Đây là những gì tôi đã viết trong file MÔ TẢ:

Mô tả: tiêu hóa gói cung cấp các chức năng cho việc tạo ra của `tiêu hóa băm' của tùy R đối tượng sử dụng MD5, SHA-1, SHA-256 Các thuật toán và crc32 cho phép dễ dàng so sánh các đối tượng ngôn ngữ R đối với các đối tượng ngôn ngữ R. Thuật toán md5 bởi Ron Rivest được quy định trong RFC 1321, SHA-1 và SHA-256 thuật toán được quy định tại FIPS-180-1 và FIPS-180-2, và các thuật toán crc32 được mô tả trong
ftp://ftp.rocksoft.com/cliens/rocksoft/papers/crc_v3.txt. Đối với md5, sha-1 và sha-256, gói này sử dụng các triển khai độc lập nhỏ được cung cấp bởi Christophe Devine. Đối với crc32, mã từ thư viện zlib được sử dụng.

Tôi nghĩ rằng một số mã của Christophe không còn ở cr0.net, nhưng tìm kiếm sẽ dẫn bạn đến một số dự án khác kết hợp nó. Tiêu đề tệp của anh ấy khá rõ ràng:

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

và mã của anh ấy khớp với đầu ra tham chiếu.

3

Trừ khi bạn đã có lý do chính đáng để sử dụng MD5, bạn có thể muốn xem xét lại. Điều gì làm cho hàm băm "tốt" trong bảng băm là khá phụ thuộc vào những gì bạn đang cố gắng thực hiện. Bạn có thể muốn đọc các bình luận trong Python dictobject.c để xem các loại cân bằng mà người khác đã thực hiện.

2

Glibc's crypt() sử dụng algorhytm dựa trên MD5 nếu muối bắt đầu bằng $ 1 $. Nhưng kể từ khi bạn đề cập rằng bạn sẽ làm một bảng băm thực hiện, có lẽ Jenkins hash sẽ được appropiate hơn.

2

Thư viện OpenSSL có tất cả các thói quen mã hóa mà bạn có thể muốn, bao gồm cả băm mật mã.

4

Đối với bảng băm, bạn không cần độ mạnh mã hóa, chỉ có các thuộc tính ngẫu nhiên tốt. Các hàm băm mật mã bị hỏng (như MD5) là tốt cho điều đó, nhưng bạn có thể muốn sử dụng MD4, nhanh hơn và đơn giản hơn, đến mức bạn chỉ có thể bao gồm việc triển khai trực tiếp trong mã của bạn. Nó không phải là khó khăn để viết lại nó từ các đặc điểm kỹ thuật (và kể từ khi bạn muốn chỉ có một chức năng cho một bảng băm, nó không thực sự là một vấn đề nếu bạn nhận được nó sai tại một số điểm). Shameless plug: có một tối ưu hóa C thực hiện MD4 trong sphlib.

+0

Tôi rất vui vì bạn không hề xấu hổ về phích cắm của mình; Tôi biết đây là một bài đăng cũ, nhưng đây vẫn là một lib tự chứa lớn. – Leo

1

gcrypt và openssl có thể làm MD5, SHA và băm khác đây là một ví dụ với 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 là một thuật toán noncryptographic nhanh đến nỗi bạn có thể sử dụng.

Một tốc độ comparation tốt thì thầm chống lại các thuật toán khác có thể được tìm thấy trong chủ đề này https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

Một thực thể: https://github.com/PeterScott/murmur3

Ví dụ:

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

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