क्या वास्तव में (और ठीक है) "हैश?"


38

मैंने "हैश" शब्द को अलग-अलग अर्थों के साथ अलग-अलग संदर्भों (कंप्यूटिंग की दुनिया के भीतर) में इस्तेमाल किया जा रहा है। उदाहरण के लिए, किताब लर्निंग पाइथन द हार्ड वे, डिक्शनरी के चैप्टर में कहा गया है, "पायथन उन्हें डायक्स कहता है।" अन्य भाषाएं उन्हें "हैश" कहती हैं। तो, क्या हैश डिक्शनरी हैं?

शब्द का अन्य सामान्य उपयोग एन्क्रिप्शन के संबंध में है। मैंने उच्च स्तर के प्रोग्रामिंग के भीतर एक विशिष्ट फ़ंक्शन के रूप में "हैश" शब्द का उपयोग करते हुए (और पढ़ा) लोगों को सुना है।

तो, वास्तव में यह क्या है?

क्या कोई भी (समय के साथ और जो जानकार है) कृपया "हैश (या हैश)" की बारीकियों को समझाएं?


8
विकिपीडिया पर हैश टेबल और क्रिप्टोग्राफिक हैश फ़ंक्शन पर विस्तृत लेख हैं । क्या आप देख रहे हैं कि उन में नहीं है?
डेविड रिचरबी

1
आप पहले से ही "हैश" शब्द के कई उपयोगों को सूचीबद्ध करते हैं, और अधिक हैं। तो, "वास्तव में क्या है?"
राफेल

4
इस अर्थ में "हैश" "हैश टेबल" का एक छोटा सा उदाहरण है, जैसे कि चाबियों के संगठन के लिए हैश का उपयोग करने वाले टेबल। यह गैसोलीन "गैस" को कॉल करने जैसा है - आप "गैस" गैस के समान होने की उम्मीद नहीं करते हैं या गैसोलीन जैसी संपत्तियां होती हैं, क्या आप? यह भाषा के साथ हर समय होता है - विशेष रूप से छोटा शब्द-ओवरलैप के बहुत सामान्य स्रोत हैं।
लुआण

1
"इस शब्द की कोई परिभाषा नहीं है - कोई नहीं जानता कि हैश क्या है।" - डेविल्स डिक्शनरी
jpmc26

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

जवाबों:


44

हैश फ़ंक्शंस पर विकिपीडिया लेख बहुत अच्छा है, लेकिन मैं यहाँ अपना टेक दूंगा।


हैश क्या है?

"हैश" वास्तव में विभिन्न संदर्भों में विभिन्न औपचारिक अर्थों के साथ एक व्यापक शब्द है। आपके प्रश्न का एक भी सही उत्तर नहीं है। मैं सामान्य अंतर्निहित अवधारणा की व्याख्या करूंगा और शब्द के कुछ सबसे सामान्य उपयोगों का उल्लेख करूंगा।

एक "हैश" एक समारोह है के रूप में भेजा हैश फंक्शन कि इनपुट वस्तुओं के रूप में लेता है और एक स्ट्रिंग या संख्या आउटपुट। इनपुट ऑब्जेक्ट आमतौर पर मूल डेटा प्रकारों के सदस्य होते हैं जैसे कि स्ट्रिंग, पूर्णांक, या उपयोगकर्ता परिभाषित संरचनाओं जैसी अन्य वस्तुओं से बने बड़े। आउटपुट आमतौर पर एक संख्या या एक स्ट्रिंग है। संज्ञा "हैश" अक्सर इस आउटपुट को संदर्भित करता है। क्रिया "हैश" का अर्थ अक्सर "हैश फ़ंक्शन लागू करना" होता है। एक हैश फ़ंक्शन में मुख्य गुण निम्न होने चाहिए:h

  1. गणना करना आसान होना चाहिए और
  2. आउटपुट अपेक्षाकृत छोटा होना चाहिए।

उदाहरण:

मान लें कि हम 0 से 99,999,999 की रेंज में 0 से 99 के बीच की संख्या में हैश करना चाहते हैं। एक साधारण हैश फ़ंक्शन ।h(x)=xmod100

सामान्य अतिरिक्त गुण:

उपयोग के मामले के आधार पर हम अतिरिक्त गुणों को पूरा करने के लिए हैश फ़ंक्शन चाहते हैं। यहां कुछ सामान्य अतिरिक्त गुण दिए गए हैं:

  1. एकरूपता : अक्सर हम चाहते हैं कि वस्तुओं की हैश अलग हो। इसके अलावा, हम चाहते हैं कि हैश "फैलने वाली" हो। अगर मैं कुछ वस्तुओं को 100 बाल्टियों में गिराना चाहता हूँ (इसलिए मेरे हैश फ़ंक्शन का आउटपुट 0-99 से एक नंबर है), तो मैं आमतौर पर उम्मीद कर रहा हूं कि बाल्टी में लगभग 1/100 वस्तुएं 0 में, लगभग 1/100 भूमि में। बाल्टी 1, और इतने पर।

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

  3. संपीड़न : मैं अक्सर मनमाने ढंग से बड़े इनपुट को स्थिर आकार के आउटपुट या बाल्टी की निश्चित संख्या में रखना चाहता हूं।

  4. नियतिवाद : मैं एक हैश फ़ंक्शन चाहता हूँ जिसका आउटपुट रन के बीच नहीं बदलता है, अर्थात एक ही ऑब्जेक्ट पर हैश फ़ंक्शन का आउटपुट हमेशा समान रहेगा। यह ऊपर एकरूपता के साथ संघर्ष करने के लिए लग सकता है, लेकिन एक समाधान हैश फ़ंक्शन को यादृच्छिक रूप से एक बार चुनना है, और इसे रनों के बीच बदलना नहीं है।


कुछ अनुप्रयोग

एक सामान्य एप्लिकेशन हैश टेबल जैसी डेटा संरचनाओं में है, जो शब्दकोशों को लागू करने का एक तरीका है। यहां, आप कुछ मेमोरी आवंटित करते हैं, कहते हैं, 100 "बाल्टी"; फिर, जब शब्दकोश में एक (कुंजी, मान) जोड़ी को स्टोर करने के लिए कहा जाता है, तो आपके पास नंबर 0-99 की कुंजी है, और जोड़ी को स्मृति में इसी बाल्टी में संग्रहीत करें। फिर, जब आपको एक कुंजी देखने के लिए कहा जाता है, तो आप उसी हैश फ़ंक्शन के साथ 0-99 की संख्या में कुंजी को हैश करते हैं और उस बाल्टी को यह देखने के लिए जांचते हैं कि क्या वह कुंजी है। यदि हां, तो आप इसका मूल्य लौटाते हैं।

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

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

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


1
अच्छी व्याख्या लेकिन मैं "बहुत संभावना नहीं" से असहमत हूं। देखें: programmers.stackexchange.com/questions/49550/... : टक्कर करते पाए जाते हैं, और कभी कभी आश्चर्यजनक रूप से अक्सर।
ओलिवियर दुलक

8
यह भी ध्यान दें कि साइबरोग्राफी के संदर्भ में, शब्द "हैश" बहुत दृढ़ता से एक "वन-वे" ऑपरेशन है, जो आसानी से अभ्यास में उलट नहीं किया जा सकता है। जब इसे आसानी से उलटा जा सकता है, तो इसे "एन्क्रिप्शन" कहा जाता है। यही कारण है कि Security.SE पर लोग आपको अपने ग्राहकों के पासवर्ड को हमेशा हैश करने के लिए कहेंगे, कभी भी उन्हें एन्क्रिप्ट न करने के लिए।
Ixrec

4
एक हैश जो "फैलता नहीं" है अभी भी एक हैश है, शायद आपके आवेदन के लिए बहुत अच्छा नहीं है।
मोनिका

1
निश्चित रूप से, ये सभी अच्छे बिंदु हैं।
usul

10

एक हैश समारोह एक समारोह है कि एक इनपुट लेता है और तय आकार का एक मूल्य पैदा करता है। उदाहरण के लिए आपके पास एक हैश फ़ंक्शन हो सकता है जो किसी भी लम्बाई को stringHashस्वीकार करता है stringऔर 32-बिट पूर्णांक बनाता है।

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

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

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

तो, जबकि अवधि के सही उपयोग हैश का उल्लेख करने के लिए है हैश मान एक द्वारा उत्पादित हैश फंक्शन , लोगों को भी कभी कभी अवधि अनौपचारिक रूप से उल्लेख करने के लिए उपयोग करने के हैश फंक्शन और हैश तालिकाओं , इसलिए भ्रम की स्थिति पैदा कर।


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

1
@DavidRicherby औपचारिक रूप से, मैं कहूंगा कि काम "हैश" अपरिभाषित है। "हैश फंक्शन", "हैश वैल्यू", "हैश टेबल", और "हैश ए स्ट्रिंग" सभी में सटीक गणितीय परिभाषा है लेकिन "हैश" अस्पष्ट है। इसी तरह, मुझे पता है कि आपको "वाशिंगटन" से क्या मतलब है, लेकिन आपका वाक्य अभी भी समझ में आता है अगर मैं "वाशिंगटन" की व्याख्या "जॉर्ज वाशिंगटन" या "डेनजेल वाशिंगटन" के बजाय "वाशिंगटन शहर" से करता हूं, जो एक बेहद अनौपचारिक तरीका है संघीय सरकार को संदर्भित करने के लिए। निचला रेखा: कठोर औपचारिक परिभाषा के लिए "यह जानना कि आप क्या मतलब है" को भ्रमित न करें।
माइक ऑउंसवर्थ

@DavidRicherby यह वास्तव में एक समरूप उपमा नहीं है। गलत बहस बहस है, लेकिन अनौपचारिकता नहीं है।
फराप

2

एक हैश फ़ंक्शन मोटे तौर पर कोई भी फ़ंक्शन है जहां छवि डोमेन से छोटी है । ऐसे फ़ंक्शन के आउटपुट f(x)को "हैश" के रूप में संदर्भित किया जा सकता है x

कंप्यूटर विज्ञान में हम आम तौर पर हैश फ़ंक्शन के दो अनुप्रयोगों का सामना करते हैं।

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

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

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


और मुझे अभी भी आपके पहले वाक्य पर आपत्ति है क्योंकि जब SHA-512 के साथ 32-चरित्र वाले पासवर्ड हैशिंग, इनपुट स्पेस वास्तव में आउटपुट स्पेस से छोटा है। जब हैश फंक्शनिंग एक साथ करते हैं, तो डोमेन और रेंज समान होते हैं; इनपुट स्पेस का आकार अप्रासंगिक है। फ्राॅप के उत्तर की सही परिभाषा है: "एक हैश फ़ंक्शन निश्चित लंबाई वाले आउटपुट के साथ कोई भी फ़ंक्शन है"। यह वही है, जो आप की जरूरत है, अन्य सभी शर्तों के बारे में बात कर रहे हैं जो उस से निहित हैं।
माइक ओउंसवर्थ

@MikeOunsworth लेकिन SHA-512 का डोमेन मनमाना लंबाई का बाइनरी स्ट्रिंग्स है। मुझे लगता है कि मैं फार्प्स वर्डिंग को चुरा सकता था, लेकिन मैं ओपी के लाभ के लिए शर्तों को स्पष्ट करने की कोशिश कर रहा था। मुझे वास्तव में यकीन नहीं है कि "निश्चित लंबाई की" आवश्यक है, न ही स्पष्ट रूप से परिभाषित।
हर्किंग मोनिका

@ ऑरेंजडॉग ठीक है, लेकिन मैं SHA-512 को एक फ़ंक्शन के अंदर लपेट सकता हूं, जिसे कहा जाता है MikesHash()कि लंबाई 12 के तार को स्वीकार करता है और उन्हें SHA-512 को पास करता है, और आउटपुट देता है। मुझे पूरा यकीन है कि MikesHash()अभी भी हैश फ़ंक्शन की परिभाषा मिलती है। (व्यवहार में आप सही कह रहे हैं, हैश फ़ंक्शन का उपयोग हम मनमाने ढंग से लंबाई इनपुट स्वीकार करते हैं, लेकिन मुझे नहीं लगता कि कुछ हैश फ़ंक्शन होने में विफल रहता है अगर ऐसा नहीं होता है।)
माइक Ounsworth

@MikeOunsworth समान रूप से मैं इसे इस तरह से लपेट सकता हूं कि यदि msb एक है तो आउटपुट छोटा या गद्देदार है। आउटपुट निश्चित लंबाई का नहीं है, लेकिन क्या यह अभी भी एक हैश फ़ंक्शन है?
मोनिका

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

0

महान प्रश्न तुलसी अजित,

यहाँ मेरा दृष्टिकोण है कि एक हैश जो मैं आज काम कर रहा हूं, उसके लिए है।

*

डाउनलोड पृष्ठ के लिए तारकोल है सत्यापित करने के लिए चेक राशि का उपयोग करें

*

यहाँ छवि विवरण दर्ज करें ऑडिटर टोपी पर डालता है, मेरा मतलब है जादूगर बागे

हैश एक मूल्य / स्ट्रिंग / जो कुछ भी / लेबल आपके मशीन पर डाउनलोड के स्रोत के रूप में सुनिश्चित करें।


3
यह हैश के लिए केवल एक उपयोग है। कई अन्य उपयोग हैं।
युवल फिल्मस

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

-1

मैं बस दूसरों के कहे के छोटे सारांश को जोड़ने की कोशिश करूँगा।

हैश फंकशन

हैश फ़ंक्शंस नामक एक विशेष प्रकार के फ़ंक्शन हैं।

"SHA256 एक प्रसिद्ध हैश फ़ंक्शन है जो क्रिप्टोग्राफिक रूप से सुरक्षित है"

तीन मुख्य अनुप्रयोग हैं * हैश टेबल, * चेकसम (हार्ड ड्राइव या एडीएसएल प्रोटोकॉल में डेटा अखंडता चेक जैसे), * और क्रिप्टोग्राफी (क्रिप्टोग्राफ़िक प्रमाणीकरण के विभिन्न रूप, लेकिन डिजिटल हस्ताक्षर और सुरक्षित पासवर्ड भंडारण तक सीमित नहीं)।

हैश टेबल

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

"डेटाबेस खोज अनुरोधों के निष्पादन में तेजी लाने के लिए आंतरिक रूप से हैश टेबल और खोज पेड़ों का उपयोग करते हैं"

हैश

  1. एक शब्दकोश सार डेटा प्रकार

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

  1. कुछ इनपुट पर हैश फ़ंक्शन को लागू करने का परिणाम

"एमडी 5 हैश की .iso छवियां डाउनलोड करने के बाद उनकी अखंडता की जांच करने के लिए प्रदान की जाती हैं"।

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