हैश फ़ंक्शंस पर विकिपीडिया लेख बहुत अच्छा है, लेकिन मैं यहाँ अपना टेक दूंगा।
हैश क्या है?
"हैश" वास्तव में विभिन्न संदर्भों में विभिन्न औपचारिक अर्थों के साथ एक व्यापक शब्द है। आपके प्रश्न का एक भी सही उत्तर नहीं है। मैं सामान्य अंतर्निहित अवधारणा की व्याख्या करूंगा और शब्द के कुछ सबसे सामान्य उपयोगों का उल्लेख करूंगा।
एक "हैश" एक समारोह है के रूप में भेजा हैश फंक्शन
कि इनपुट वस्तुओं के रूप में लेता है और एक स्ट्रिंग या संख्या आउटपुट। इनपुट ऑब्जेक्ट आमतौर पर मूल डेटा प्रकारों के सदस्य होते हैं जैसे कि स्ट्रिंग, पूर्णांक, या उपयोगकर्ता परिभाषित संरचनाओं जैसी अन्य वस्तुओं से बने बड़े। आउटपुट आमतौर पर एक संख्या या एक स्ट्रिंग है। संज्ञा "हैश" अक्सर इस आउटपुट को संदर्भित करता है। क्रिया "हैश" का अर्थ अक्सर "हैश फ़ंक्शन लागू करना" होता है। एक हैश फ़ंक्शन में मुख्य गुण निम्न होने चाहिए:h
- गणना करना आसान होना चाहिए और
- आउटपुट अपेक्षाकृत छोटा होना चाहिए।
उदाहरण:
मान लें कि हम 0 से 99,999,999 की रेंज में 0 से 99 के बीच की संख्या में हैश करना चाहते हैं। एक साधारण हैश फ़ंक्शन ।h(x)=xmod100
सामान्य अतिरिक्त गुण:
उपयोग के मामले के आधार पर हम अतिरिक्त गुणों को पूरा करने के लिए हैश फ़ंक्शन चाहते हैं। यहां कुछ सामान्य अतिरिक्त गुण दिए गए हैं:
एकरूपता : अक्सर हम चाहते हैं कि वस्तुओं की हैश अलग हो। इसके अलावा, हम चाहते हैं कि हैश "फैलने वाली" हो। अगर मैं कुछ वस्तुओं को 100 बाल्टियों में गिराना चाहता हूँ (इसलिए मेरे हैश फ़ंक्शन का आउटपुट 0-99 से एक नंबर है), तो मैं आमतौर पर उम्मीद कर रहा हूं कि बाल्टी में लगभग 1/100 वस्तुएं 0 में, लगभग 1/100 भूमि में। बाल्टी 1, और इतने पर।
क्रिप्टोग्राफिक टकराव प्रतिरोध : कभी-कभी इसे और भी आगे ले जाया जाता है, उदाहरण के लिए, क्रिप्टोग्राफी में मैं एक हैश फ़ंक्शन चाहता हूं, जैसे कि एक ही आउटपुट के लिए दो अलग-अलग इनपुट को खोजने के लिए एक विरोधी के लिए यह कम्प्यूटेशनल रूप से मुश्किल है।
संपीड़न : मैं अक्सर मनमाने ढंग से बड़े इनपुट को स्थिर आकार के आउटपुट या बाल्टी की निश्चित संख्या में रखना चाहता हूं।
नियतिवाद : मैं एक हैश फ़ंक्शन चाहता हूँ जिसका आउटपुट रन के बीच नहीं बदलता है, अर्थात एक ही ऑब्जेक्ट पर हैश फ़ंक्शन का आउटपुट हमेशा समान रहेगा। यह ऊपर एकरूपता के साथ संघर्ष करने के लिए लग सकता है, लेकिन एक समाधान हैश फ़ंक्शन को यादृच्छिक रूप से एक बार चुनना है, और इसे रनों के बीच बदलना नहीं है।
कुछ अनुप्रयोग
एक सामान्य एप्लिकेशन हैश टेबल जैसी डेटा संरचनाओं में है, जो शब्दकोशों को लागू करने का एक तरीका है। यहां, आप कुछ मेमोरी आवंटित करते हैं, कहते हैं, 100 "बाल्टी"; फिर, जब शब्दकोश में एक (कुंजी, मान) जोड़ी को स्टोर करने के लिए कहा जाता है, तो आपके पास नंबर 0-99 की कुंजी है, और जोड़ी को स्मृति में इसी बाल्टी में संग्रहीत करें। फिर, जब आपको एक कुंजी देखने के लिए कहा जाता है, तो आप उसी हैश फ़ंक्शन के साथ 0-99 की संख्या में कुंजी को हैश करते हैं और उस बाल्टी को यह देखने के लिए जांचते हैं कि क्या वह कुंजी है। यदि हां, तो आप इसका मूल्य लौटाते हैं।
ध्यान दें कि आप अन्य तरीकों से भी शब्दकोशों को लागू कर सकते हैं, जैसे कि एक बाइनरी सर्च ट्री (यदि आपकी वस्तुएं तुलनीय हैं)।
एक और व्यावहारिक अनुप्रयोग चेकसम है, जो यह जांचने के तरीके हैं कि दो फाइलें समान हैं (उदाहरण के लिए, फ़ाइल को इसके दूसरे संस्करण से दूषित नहीं किया गया था)। क्योंकि हैश फ़ंक्शन एक ही आउटपुट के दो इनपुट को मैप करने की संभावना नहीं है, आप पहली फ़ाइल के हैश की गणना करते हैं और स्टोर करते हैं, आमतौर पर एक स्ट्रिंग के रूप में दर्शाया जाता है। यह हैश बहुत छोटा है, शायद केवल कुछ दर्जन ASCII वर्ण हैं। फिर, जब आप दूसरी फ़ाइल प्राप्त करते हैं, तो आप हैश करते हैं और जांचते हैं कि आउटपुट समान है। यदि हां, तो लगभग निश्चित रूप से यह सटीक फ़ाइल बाइट-फॉर-बाइट है।
एक अन्य एप्लिकेशन क्रिप्टोग्राफी में है, जहां इन हैश को "इनवर्ट" करना मुश्किल होना चाहिए - अर्थात, आउटपुट और हैश फ़ंक्शन को देखते हुए, उस आउटपुट के लिए इनपुट (एस) का पता लगाने के लिए कम्प्यूटेशनल रूप से कठिन होना चाहिए। इसका एक उपयोग पासवर्ड के लिए है: पासवर्ड को स्वयं संग्रहीत करने के बजाय, आप पासवर्ड का क्रिप्टोग्राफ़िक हैश (शायद कुछ अन्य सामग्री के साथ) संग्रहीत करते हैं। फिर, जब कोई उपयोगकर्ता पासवर्ड दर्ज करता है, तो आप उसके हैश की गणना करते हैं और जांचते हैं कि यह सही हैश से मेल खाता है; यदि हां, तो आप कहते हैं कि पासवर्ड सही है। (अब भी कोई है जो सर्वर पर सहेजे गए हैश को देख और पता लगा सकता है, उसके पास उपयोगकर्ता होने का नाटक करने का इतना आसान समय नहीं है।) यह एप्लिकेशन एक ऐसा मामला हो सकता है जहां आउटपुट इनपुट से लंबे या लंबे समय तक रहता है। इनपुट बहुत कम है।