2010-10-14 14 views
9

मैं सी में कस्टम हैश तालिका कार्यान्वयन करना चाहता हूं। क्या जीएनयू लाइब्रेरी में पहले से ही एक MD5/SHA1 हैश फ़ंक्शन है या क्या मुझे इसके लिए बाहरी लाइब्रेरी का उपयोग करना है?क्या कोई ग्लिब हैश फ़ंक्शन है?

यहाँ थोड़े मैं के लिए क्या देख रहा हूँ है:

int hashValue; 

hashValue = MD5_HASH(valToHash); 
+3

यहां तक ​​कि अगर वहाँ था, तुम होगा एक लंबाई पैरामीटर भी पास करने के लिए। – Blindy

उत्तर

5

आप कई हैश फंक्शन के बॉब Jenkin के सर्वेक्षण पर एक नज़र और विश्लेषण ले जा सकते हैं:

या बस में अपने lookup3 दिनचर्या (जो उन्होंने सार्वजनिक डोमेन में रखा है) छोड़ अपने परियोजना:

3

में कुछ विश्वसनीय, सरल संस्करण उपलब्ध हैं - मैं R के लिए digest के स्रोतों में कुछ है।

विवरण:: डाइजेस्ट पैकेज md5, SHA-1, SHA-256 का उपयोग करते हुए `मनमाना आर वस्तुओं के हैश 'डाइजेस्ट के निर्माण के लिए कार्य प्रदान करता यहाँ है कि मैं क्या वर्णन फ़ाइल में लिखा है और सीआरसी 32 एल्गोरिदम आसान आर भाषा वस्तुओं की तुलना की अनुमति देता है। रॉन रिवेस्ट द्वारा MD5 एल्गोरिदम आरएफसी 1321 में निर्दिष्ट किया जाता, SHA-1 और SHA-256 एल्गोरिदम में निर्दिष्ट कर रहे हैं FIPS-180-1 और FIPS-180-2, और CRC32 एल्गोरिथ्म
में वर्णन किया गया ftp://ftp.rocksoft.com/cliens/rocksoft/papers/crc_v3.txt। एमडी 5, शा -1 और शा -256 के लिए, यह पैकेज छोटे स्टैंडअलोन कार्यान्वयन का उपयोग करता है जो क्रिस्टोफ़ डेविन द्वारा प्रदान किए गए थे। Crc32 के लिए, zlib लाइब्रेरी से कोड का उपयोग किया जाता है।

मुझे लगता है कि क्रिस्टोफ़ का कोड अब cr0.net पर नहीं है, लेकिन खोजों से आपको इसमें शामिल कई अन्य परियोजनाओं का नेतृत्व करना चाहिए। उनके फ़ाइल हेडर बहुत स्पष्ट थे:

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

और उसका कोड संदर्भ आउटपुट से मेल खाता है।

3

जब तक आपके पास पहले से ही MD5 का उपयोग करने का कोई अच्छा कारण नहीं है, तो आप पुनर्विचार करना चाहेंगे। हैश टेबल में "अच्छा" हैश फ़ंक्शन के लिए जो कुछ भी आप पूरा करने की कोशिश कर रहे हैं उस पर निर्भर है। दूसरों द्वारा किए गए ट्रेडऑफ के प्रकारों को देखने के लिए आप पाइथन के dictobject.c में टिप्पणियां पढ़ना चाह सकते हैं।

2

ग्लिब के crypt() एमडी 5 आधारित एल्गोरिदम का उपयोग करता है यदि नमक $ 1 $ के साथ शुरू होता है। लेकिन चूंकि आप उल्लेख करते हैं कि आप हैश टेबल कार्यान्वयन करने जा रहे हैं, शायद जेनकिन्स हैश अधिक एप्राइपियेट होगा।

2

ओपनएसएसएल लाइब्रेरी में क्रिप्टोग्राफिक हैंश सहित सभी क्रिप्टो रूटीन हैं जिन्हें आप कभी चाह सकते हैं।

4

हैश तालिका के लिए, आपको क्रिप्टोग्राफिक शक्ति, केवल अच्छी यादृच्छिकता गुणों की आवश्यकता नहीं है। टूटा क्रिप्टोग्राफ़िक हैश फ़ंक्शन (जैसे एमडी 5) इसके लिए ठीक है, लेकिन आप MD4 का उपयोग करना चाह सकते हैं, जो कि तेज़ और सरल दोनों है, इस बिंदु पर कि आप सीधे अपने कोड में कार्यान्वयन को शामिल कर सकते हैं। विनिर्देशन से इसे फिर से लिखना मुश्किल नहीं है (और चूंकि आप केवल हैश तालिका के लिए एक फ़ंक्शन चाहते हैं, इसलिए यदि आप किसी बिंदु पर गलत पाते हैं तो यह वास्तव में कोई समस्या नहीं है)। लापरवाह प्लग: sphlib में एमडी 4 का एक अनुकूलित सी कार्यान्वयन है।

+0

मुझे खुशी है कि आपको अपने प्लग पर कोई शर्म नहीं थी; मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन यह अभी भी एक महान आत्मनिर्भर lib है। – Leo

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 एक तेजी से noncryptographic एल्गोरिथ्म है कि आप उपयोग कर सकते हैं।

अन्य एल्गोरिदम के खिलाफ बड़बड़ाहट का एक अच्छा गति comparation इस सूत्र में पाया जा सकता 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);