2010-10-14 59 views
9

我期待在C中執行自定義哈希表實現。在GNU庫中是否存在MD5/SHA1哈希函數,還是必須爲此使用外部庫?是否有glibc散列函數?

這裏是有點什麼我在尋找:

int hashValue; 

hashValue = MD5_HASH(valToHash); 
+3

即使有,你必須也傳遞一個長度參數。 – Blindy 2010-10-14 18:02:47

回答

3

有幾個值得信賴的,簡單的可用版本 - 我在digest來源數爲R。 以下是我在描述文件中寫道:

描述:摘要包 提供了使用MD5,SHA-1,SHA-256的`任意ř 對象的哈希」摘要創建 功能 和crc32算法允許比較R語言對象。由Ron Rivest的 MD5算法 在RFC 1321規定,SHA-1和 SHA-256算法中指定 FIPS-180-1和FIPS 180-2,並且 CRC32算法在
描述ftp://ftp.rocksoft.com/cliens/rocksoft/papers/crc_v3.txt。 對於md5,sha-1和sha-256,此 程序包使用由Christophe Devine提供的小型獨立版 實現。對於crc32,使用來自zlib庫的代碼 。

我認爲Christophe的一些代碼不再在cr0.net上,但是搜索應該引導您將其引入到其他幾個項目中。他的文件頭很清晰:

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

和他的代碼匹配參考輸出。

3

除非您已經有了使用MD5的充分理由,否則您可能需要重新考慮。什麼使散列表中的「好」散列函數非常依賴於你想要完成的工作。您可能想閱讀Python的dictobject.c中的評論,看看其他人做出的折衷。

2

Glibc的crypt()使用基於MD5的算法,如果鹽以$ 1 $開始。但既然你提到你要做一個哈希表實現,也許詹金斯哈希會更合適。

2

OpenSSL庫擁有您想要的所有加密例程,包括加密哈希。

4

對於散列表,您不需要加密強度,只需要很好的隨機化屬性。破碎的加密散列函數(如MD5)對此很好,但您可能希望使用MD4,它更快更簡單,直到您可以直接在代碼中包含實現。從規範中重寫它並不難(因爲只需要一個哈希表的函數,如果在某個時候出錯了,它不是一個真正的問題)。無恥的插件:在sphlib有一個優化的C實現MD4。

+0

我很高興你的插頭沒有羞恥;我知道這是一箇舊帖子,但這仍然是一個很好的獨立庫。 – Leo 2015-04-15 16:04:22

1

gcrypt和OpenSSL可以做MD5,SHA等哈希這裏與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是一種快速的非加密算法,就可以使用。

與其他算法雜音的一個很好的速度比較 - 可以在此線程中找到https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

一種可能的實現:https://github.com/PeterScott/murmur3

例子:

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

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