एक अच्छा हैश फंक्शन क्या है?


130

एक अच्छा हैश फंक्शन क्या है? मैंने कॉलेज में अपने डेटा स्ट्रक्चर्स पाठ्यक्रमों में बहुत से हैश फ़ंक्शन और एप्लिकेशन देखे, लेकिन मुझे ज्यादातर यह मिला कि एक अच्छा हैश फ़ंक्शन करना बहुत कठिन है। टकराव से बचने के लिए एक नियम के रूप में मेरे प्रोफेसर ने कहा कि:

function Hash(key)
  return key mod PrimeNumber
end

(mod C और समान भाषाओं में% ऑपरेटर है)

प्राइम नंबर के साथ हैश टेबल का आकार। मुझे लगता है कि टकराव और तेजी से बचने के लिए यह एक अच्छा कार्य है, लेकिन मैं एक बेहतर कैसे बना सकता हूं? क्या संख्यात्मक कुंजी के खिलाफ स्ट्रिंग कुंजी के लिए बेहतर हैश फ़ंक्शन हैं?


34
क्या आपने निम्नलिखित सामान्य उद्देश्य हैश कार्यों में से एक या अधिक का उपयोग करने पर विचार किया है: partow.net/programming/hashfunctions/index.html

Fnv_func में, p [i] का प्रकार चार है, पहले पुनरावृत्ति के बाद h के साथ क्या होगा? क्या यह उद्देश्य में किया गया था?

5
@martinatime ने कहा: विकिपीडिया en.wikipedia.org/wiki/Hash_function में हैश फ़ंक्शंस के आसपास सूचनाओं का एक समूह है और इस लेख के निचले भाग partow.net/programming/hashfunctions.index.html पर विभिन्न भाषाओं में एल्गोरिदम लागू है।
2501

जवाबों:


33

मूल रूप से किसी भी तरह के डेटा पर "सामान्य" हैश टेबल लुकअप करने के लिए - पॉल हेसिह द्वारा यह एक सबसे अच्छा मैं कभी भी इस्तेमाल किया है।

http://www.azillionmonkeys.com/qed/hash.html

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


जानकारीपूर्ण लिंक के लिए धन्यवाद! मैं बॉब जेनकिन्स और अन्य लोगों द्वारा कुछ विश्लेषणों को जानता हूं जो काफी हद तक सार्वभौमिक रूप से स्वीकार्य हैश कार्यों को इंगित करते हैं लेकिन मैं अभी तक इस पर नहीं आया हूं।
कोनराड रुडोल्फ

मैंने जेनकिंस की साइट से पढ़ा था कि एसएफएच सर्वश्रेष्ठ में से एक है, लेकिन मुझे लगता है कि मुरमुर बेहतर कर सकता है, इस उत्कृष्ट उत्तर को देखें: प्रोग्रामर.स्टैकएक्सचेंज.
com

2
YMMV किस लिए खड़ा है?
कोबराज़न

3
@cobarzan आपका माइलेज मई वैरी
प्रोग्रामरडान

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

51

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

हैश टेबल की बहुत अलग आवश्यकताएं हैं। लेकिन फिर भी, एक अच्छा हैश फ़ंक्शन को सार्वभौमिक रूप से खोजना मुश्किल है क्योंकि विभिन्न डेटा प्रकार अलग-अलग जानकारी को उजागर करते हैं जो हैशेड हो सकते हैं। अंगूठे के एक नियम के रूप में, सभी सूचनाओं पर विचार करना अच्छा है जो एक प्रकार समान रूप से रखती है। यह हमेशा आसान या संभव भी नहीं होता है। आँकड़ों के कारणों (और इसलिए टकराव) के लिए, समस्या स्थान यानी सभी संभावित वस्तुओं पर एक अच्छा प्रसार उत्पन्न करना भी महत्वपूर्ण है। इसका मतलब यह है कि जब हैशिंग संख्या 100 और 1050 के बीच है, तो यह महत्वपूर्ण नहीं है कि सबसे महत्वपूर्ण अंक को हैश में एक बड़ा हिस्सा खेलने दें क्योंकि ~ 90% वस्तुओं के लिए, यह अंक 0. होगा। अंतिम तीन को छोड़ना अधिक महत्वपूर्ण है। अंक हैश का निर्धारण करते हैं।

इसी तरह, जब हैशिंग के तार सभी वर्णों पर विचार करने के लिए महत्वपूर्ण होते हैं - जब यह पहले से ज्ञात हो कि सिवाय इसके कि सभी तारों के पहले तीन वर्ण समान होंगे; इन पर विचार करना एक बेकार है।

यह वास्तव में उन मामलों में से एक है जहां मैं पढ़ने की सलाह देता हूं कि द आर्ट ऑफ कंप्यूटर प्रोग्रामिंग में वॉल्यूम को क्या कहना है । 3. एक और अच्छा पढ़ा जुलिएन वॉकर द आर्ट ऑफ हैशिंग है


1
कोनराड, आप निश्चित रूप से एक सैद्धांतिक दृष्टिकोण से सही हैं, लेकिन क्या आपने कभी पॉल हेशेह हैश फ़ंक्शन का उपयोग किया है जिसका मैंने अपनी टिप्पणी में उल्लेख किया है? यह वास्तव में बहुत सारे विभिन्न प्रकार के डेटा के खिलाफ काफी अच्छा है!
क्रिस हैरिस

9

हैशिंग कार्यों के दो प्रमुख उद्देश्य हैं:

  • डेटा बिंदुओं को समान रूप से n बिट्स में फैलाने के लिए।
  • इनपुट डेटा को सुरक्षित रूप से पहचानने के लिए।

यह जानने के बिना कि आप इसका उपयोग कर रहे हैं, बिना हैश की सिफारिश करना असंभव है।

यदि आप किसी प्रोग्राम में हैश टेबल बना रहे हैं, तो आपको इस बारे में चिंता करने की आवश्यकता नहीं है कि एल्गोरिथ्म कितना प्रतिवर्ती या हैक करने योग्य है ... SHA-1 या AES इसके लिए पूरी तरह से अनावश्यक है, आप का उपयोग करना बेहतर होगा एक FNV की भिन्नता । FNV आपके द्वारा बताए गए एक साधारण प्राइम मॉड की तुलना में बेहतर फैलाव (और इस तरह कम टकराव) को प्राप्त करता है, और यह अलग-अलग इनपुट आकारों के लिए अधिक अनुकूल है।

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


द हैश फंक्शन लाउंज का अद्यतन लिंक: larc.usp.br/~pbarreto/hflounge.html
टिम

FNV जन्मदिन की टक्कर का सामना कितनी अच्छी तरह से करता है, कहते हैं, SHA1 बंद बिट्स की समान संख्या?
केविन ह्सु

@ केविन जब तक हैश के हिमस्खलन के लक्षण अच्छे होते हैं (इनपुट में छोटे बदलाव = आउटपुट में बड़े बदलाव) तब जन्मदिन की टक्कर हैश में बिट्स का एक कार्य है। FNV-1a इस संबंध में उत्कृष्ट है, और आपके पास जितनी इच्छा हो उतने या कुछ बिट्स हैश में हो सकते हैं (हालांकि थोड़ा गणना करने के लिए थोड़ा अतिरिक्त प्रयास करना पड़ता है जो 2 की शक्ति नहीं है)।
मयूरदीन इमरोज़

5

यह एक अच्छा उदाहरण है और एक उदाहरण भी है कि आप कभी क्यों नहीं लिखना चाहेंगे। यह एक Fowler / Noll / Vo (FNV) हैश है जो समान भागों में कंप्यूटर विज्ञान प्रतिभा और शुद्ध स्वर है:

unsigned fnv_hash_1a_32 ( void *key, int len ) {
    unsigned char *p = key;
    unsigned h = 0x811c9dc5;
    int i;

    for ( i = 0; i < len; i++ )
      h = ( h ^ p[i] ) * 0x01000193;

   return h;
}

unsigned long long fnv_hash_1a_64 ( void *key, int len ) {
    unsigned char *p = key;
    unsigned long long h = 0xcbf29ce484222325ULL;
    int i;

    for ( i = 0; i < len; i++ )
      h = ( h ^ p[i] ) * 0x100000001b3ULL;

   return h;
}

संपादित करें:

  • लैंडन कर्ट नोल मूल FVN-1 एल्गोरिथ्म पर FVN-1A एल्गोरिथ्म पर अपनी साइट पर अनुशंसा करता है: बेहतर एल्गोरिथ्म हैश में अंतिम बाइट को फैलाता है। मैंने एल्गोरिथ्म को तदनुसार समायोजित किया।

3
आप कुछ जानकारी के लिए इस साइट को देखना चाहते हैं कि ये मान क्यों चुने गए हैं: isthe.com/chongo/tech/comp/fnv/#fnv-prime
Cthutu

तुम्हें आशीर्वाद देते हैं। यह छोटा, सरल, कुशल, सामान्य और प्रभावी 64-बिट हैश फंक्शन वही था जो मुझे चाहिए था।
मटेरोड

3

मैं कहूंगा कि अंगूठे का मुख्य नियम अपना रोल नहीं करना है। कुछ ऐसी चीज़ों का उपयोग करने की कोशिश करें जिन्हें अच्छी तरह से जांचा गया है, जैसे, SHA-1 या उन रेखाओं के साथ कुछ।


उसे क्रिप्टोग्राफिक रूप से सुरक्षित कुछ भी करने की आवश्यकता नहीं लगती है इसलिए SHA-1 ओवरकिल होगा।
एरिक

वैसे, भले ही SHA-1 के लिए कोई टक्कर नहीं मिली है, लेकिन ऐसा माना जाता है कि यह एक साल पहले या महीनों का मामला है। मैं SHA-256 का उपयोग करने की सलाह दूंगा।
शमूएल एलन

1

एक अच्छे हैश फ़ंक्शन में निम्न गुण होते हैं:

  1. एक संदेश के एक हैश को देखते हुए यह हमलावर के लिए एक और संदेश खोजने के लिए कम्प्यूटेशनल रूप से संभव है, जैसे कि उनका हैश समान है।

  2. संदेश की एक जोड़ी को देखते हुए, मी 'और मी, यह दो को खोजने के लिए कम्प्यूटेशनल रूप से संभव है कि एच (एम) = एच (एम')

दोनों मामले एक जैसे नहीं हैं । पहले मामले में, पहले से मौजूद हैश है जिसके लिए आप एक टकराव खोजने की कोशिश कर रहे हैं। दूसरे मामले में, आप कोई भी दो संदेश खोजने की कोशिश कर रहे हैं जो टकराते हैं। जन्मदिन "विरोधाभास" के कारण दूसरा कार्य काफी आसान है।

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

नए डिज़ाइनों में MD5 या SHA-1 का उपयोग न करें। ज्यादातर क्रिप्टोग्राफर्स, जो मैंने शामिल किए, उन्हें टूटा हुआ मानेंगे। इन दोनों डिजाइनों में कमजोरी का सिद्धांत स्रोत यह है कि दूसरी संपत्ति, जिसे मैंने ऊपर उल्लिखित किया है, इन निर्माणों के लिए नहीं है। अगर कोई हमलावर दो मैसेज, m और m 'जेनरेट कर सकता है, तो दोनों हैश का एक ही मान है कि वे आपके खिलाफ इन मैसेज का इस्तेमाल कर सकते हैं। SHA-1 और MD5 भी संदेश विस्तार के हमलों से ग्रस्त हैं, जो सावधानी से आपके आवेदन को कमजोर कर सकते हैं।

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

उम्मीद है की वो मदद करदे!


1
मुझे लगता है कि क्रिप्टोग्राफिक हैश फ़ंक्शन की सिफारिश इस मामले में वास्तव में बुरी सलाह है।
स्लाव

@ शलवा: क्यों? "क्रिप्टोग्राफ़िक हैश फ़ंक्शन कहने के लिए आपके कारण क्या हैं इस मामले में वास्तव में बुरी सलाह है?" यह बुरी सलाह क्यों है? रिश्तेदार नुकसान क्या हैं जो इसे बनाते हैं?
आइए मेरे बारे में

2
@Mowzer क्योंकि हैश नक्शे में उपयोग किया जाने वाला एक हैश फ़ंक्शन तेज़ और हल्का होना चाहिए (यह मानते हुए कि यह अभी भी अच्छा हैश प्रदान करता है), क्रिप्टो हैश स्पष्ट रूप से ब्रूट बल के हमले को रोकने के लिए कम्प्यूटेशनल रूप से महंगा होने के लिए नौकरानी थे।
स्लाव

1

आप यहां कह रहे हैं कि क्या आप चाहते हैं कि टक्कर प्रतिरोध का उपयोग करता है। SHA-2 का उपयोग करने का प्रयास करें। या एक (अच्छा) ब्लॉक सिफर का उपयोग करके एक तरह से संपीड़न फ़ंक्शन (कभी भी पहले की कोशिश नहीं की गई) का उपयोग करने की कोशिश करें, जैसे मियासुची-पर्नेल मोड में एईएस। इसके साथ समस्या यह है कि आपको निम्न की आवश्यकता है:

1) एक IV है। खिनचिन के स्थिर या उस तरह के आंशिक भागों के पहले 256 बिट्स का उपयोग करने का प्रयास करें। 2) एक पैडिंग योजना है। आसान। MD5 या SHA-3 (केकेक ['केट-चाक']] जैसे हैश से इसे फेंक दें। यदि आप सुरक्षा के बारे में परवाह नहीं करते हैं (कुछ अन्य लोगों ने यह कहा), एफएनवी या लुकिंग 2 को बॉब जेनकिन्स द्वारा देखें (वास्तव में मैं पहला व्यक्ति हूं जो लुकिंग 2 को फिर से जोड़ता है) मुरमुरैश को भी आज़माएं, यह तेज़ है (इसे देखें: .16 सीपीबी )।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.