2010-02-10 19 views
25

हैश टेबल्स को डेटा संग्रहित/पुनर्प्राप्त करने का सबसे तेज़/सर्वोत्तम तरीका कहा जाता है।सी में हैश फ़ंक्शन कैसे लिखें?

एक हैश तालिका के मेरे समझ, हैशिंग इस प्रकार है (कृपया मुझे सही कर अगर मैं गलत हूँ या कृपया जोड़ने और अधिक कुछ भी नहीं है तो):

  • एक हैश तालिका लेकिन एक सरणी कुछ भी नहीं है (एकल या बहु-आयामी) मूल्यों को स्टोर करने के लिए।
  • हैशिंग डेटा को सम्मिलित/पुनर्प्राप्त करने के लिए सरणी में अनुक्रमणिका/स्थान ढूंढने की प्रक्रिया है। आप डेटा आइटम लेते हैं और इसे हैश फ़ंक्शन में एक कुंजी के रूप में पास करते हैं और आपको डेटा/सम्मिलित करने के लिए इंडेक्स/स्थान प्राप्त होगा।

मैं एक सवाल है:

हैश की दुकान/डेटा MD5, HMAC, SHA-1 आदि जैसे प्रमाणीकरण के लिए सुरक्षा अनुप्रयोगों में इस्तेमाल एक क्रिप्टोग्राफिक हैश समारोह से अलग पुनः प्राप्त किये समारोह है ..?

वे किस तरह से अलग हैं?

  • सी में हैश फ़ंक्शन कैसे लिखें?
  • क्या इसमें कुछ मानक या दिशानिर्देश हैं?
  • हम कैसे सुनिश्चित करते हैं कि हैश फ़ंक्शन का उत्पादन i.e, अनुक्रमणिका सीमा से बाहर नहीं है?

यदि आप इन बेहतर समझने के लिए कुछ अच्छे लिंक का उल्लेख कर सकते हैं तो यह बहुत अच्छा होगा।

+1

सीमा मॉड्यूल (%) ऑपरेटर के साथ सीमित किया जा सकता है। – tur1ng

+23

निम्नलिखित पृष्ठ में सी (और कई अन्य भाषाओं) में लागू सामान्य उद्देश्य हैश फ़ंक्शंस के कई कार्यान्वयन हैं: http://partow.net/programming/hashfunctions/index.html –

उत्तर

4

बॉब जेनकिंस ने थोड़ा अच्छा, hash function अगर उसके अच्छे का गहराई से वर्णन लिखा। लेख में नए, बेहतर हैश फ़ंक्शंस के लिंक हैं, लेकिन लेखन एक अच्छा निर्माण करने की चिंताओं को संबोधित करता है।

इसके अलावा, अधिकांश हैश तालिका कार्यान्वयन वास्तव में टकराव को हल करने के लिए लिंक्ड सूचियों की एक सरणी का उपयोग करते हैं। यदि आप केवल सरणी का उपयोग करना चाहते हैं तो हैश फ़ंक्शन को टकराव की जांच करने और एक नया हैश इंडेक्स बनाने की आवश्यकता है।

आपके द्वारा उल्लेख किए गए क्रिप्टोग्राफिक हैश फ़ंक्शंस का उपयोग हैश तालिका, के लिए हैश फ़ंक्शन के रूप में किया जा सकता है लेकिन वे हैश तालिका के लिए डिज़ाइन किए गए हैश फ़ंक्शंस से बहुत धीमे हैं। गति ब्रूट फोर्स हमलों को आसान बनाता है।

11

एक क्रिप्टोग्राफिक हैश किसी भी व्यक्ति को जानबूझकर टकराव बनाने के लिए मुश्किल बनाने पर जोर देता है। हैश टेबल के लिए, आमतौर पर परिणाम के उचित प्रसार के उत्पादन पर जोर दिया जाता है। इस प्रकार, दोनों आमतौर पर काफी अलग होते हैं (विशेष रूप से, एक क्रिप्टोग्राफिक हैश आमतौर पर बहुत धीमा होता है)।

एक विशिष्ट हैश फ़ंक्शन के लिए, परिणाम केवल प्रकार से सीमित है - उदा। यदि यह size_t देता है, तो किसी भी संभावित आकार_टी को वापस करने के लिए यह बिल्कुल ठीक है। आउटपुट रेंज को आपकी तालिका के आकार में कम करने के लिए यह निर्भर है (उदाहरण के लिए अपनी तालिका के आकार से विभाजित शेष का उपयोग करना, जो अक्सर एक प्रमुख संख्या होना चाहिए)।

उदाहरण के लिए, एक बहुत विशिष्ट उदाहरण सामान्य हैश फंक्शन कुछ लग सकता है जैसे:

// warning: untested code. 
size_t hash(char const *input) { 

    const int ret_size = 32; 
    size_t ret = 0x555555; 
    const int per_char = 7; 

    while (*input) { 
     ret ^= *input++; 
     ret = ((ret << per_char) | (ret >> (ret_size - per_char)); 
    } 
    return ret; 
} 

यहाँ मूल विचार (परिणाम को प्रभावित इनपुट स्ट्रिंग के हर बिट के लिए है, और करने के लिए जितनी जल्दी संभव हो) इनपुट के कम से कम हिस्से से प्रभावित परिणाम का हर बिट है। ध्यान दें कि मैं विशेष रूप से इसे एक महान हैश फ़ंक्शन के रूप में अनुशंसा नहीं कर रहा हूं - केवल आप जो कुछ हासिल करने की कोशिश कर रहे हैं उसके कुछ मूलभूत चित्रों को चित्रित करने का प्रयास कर रहे हैं।

+0

क्रिप्टोग्राफ़िक हैश फ़ंक्शन आवश्यक रूप से धीमे नहीं हैं। विशेष रूप से, कुछ प्लेटफार्मों पर एमआर 4 हैश फ़ंक्शन सीआरसी 32 से तेज होने की सूचना दी गई थी (एआरएम-आधारित, मुझे लगता है)। हालांकि, क्रिप्टोग्राफिक हैश फ़ंक्शंस में एक बड़ा निश्चित ओवरहेड होता है, जिसका अर्थ है कि वे छोटे इनपुट संदेशों के लिए धीमे हो जाएंगे। एमडी 4 जैसे एक समारोह में इसकी उच्च प्रोसेसिंग बैंडविड्थ (मेरे 2.4 गीगाहर्ट्ज इंटेल सीपीयू पर 600 एमबी/एस से अधिक) प्राप्त होता है जब इनपुट आकार 1 केबी से अधिक होता है। फिर भी, छोटे इनपुट (54 बाइट से कम) के लिए, मेरा पीसी अभी भी प्रति सेकंड 8 लाख एमडी 4 (एकल कोर के साथ) की गणना करता है। –

+0

@ थॉमस: सबसे पहले, जबकि सीआरसी 32 काफी तेज़ हो सकता है, अधिकांश हैश फ़ंक्शंस थोड़ा तेज़ हैं। दूसरा, जबकि यह निश्चित रूप से एक क्रिप्टोग्राफिक हैश के रूप में किया गया था, एमडी 4 वास्तव में अब योग्य नहीं है। यह साल पहले व्यापक रूप से टूटा हुआ था - एक टक्कर पैदा करना मूल हैश उत्पन्न करने के समान गति के बारे में है। देखें: एक कार्यान्वयन के लिए http://www.stachliu.com/md4coll.c। –

+0

मुझे पता है कि एमडी 4 टूट गया था, लेकिन गैर-क्रिप्टोग्राफिक उद्देश्यों के लिए (जिनके बारे में हम बात कर रहे हैं) एमडी 4 काफी अच्छा है; यदि जानबूझकर टकराव एक मुद्दा है, तो परिभाषा के अनुसार, प्रत्येक गैर-क्रिप्टोग्राफ़िक हैश फ़ंक्शन को अस्वीकार कर दिया जाता है। जब कोई सुरक्षा समस्या नहीं होती है, तो एमडी 4 कम से कम कल्पना की जा सकती है। कुछ पीयर-टू-पीयर सिस्टम फ़ाइल तत्वों की पहचान के लिए एमडी 4 का उपयोग करते हैं। तेजी से लेकिन मजबूत क्रिप्टोग्राफिक कार्यों के लिए, एक नया चयन करने के लिए एक सतत प्रतियोगिता है। विवरण के लिए http://en.wikipedia.org/wiki/NIST_hash_function_competition देखें (मैं उम्मीदवारों में से एक का सह-लेखक हूं)। –

0

डिजाइन लक्ष्य अलग हैं।

cryptographic hash functions के साथ, उदाहरण के लिए, हैश और हैश फ़ंक्शन का उपयोग मूल डेटा या किसी अन्य डेटा को निर्धारित करने के लिए नहीं किया जा सकता है जो एक ही हैश उत्पन्न करेगा।

हैश टेबल & के साथ उपयोग किए गए हैश फ़ंक्शंस अन्य डेटा संरचनाओं को ऐसी सुरक्षा गुणों की आवश्यकता नहीं है। हैश फ़ंक्शन तेज़ होने पर यह अक्सर पर्याप्त होता है और यह संभवतः संभावित हैश के सेट में इनपुट सेट को वितरित करेगा (अनावश्यक क्लस्टरिंग/टकराव से बचने के लिए)।

संबंधित मुद्दे