कंसिस्टेंट हैशिंग

कंप्यूटर विज्ञान में, कंसिस्टेंट हैशिंग एक विशेष प्रकार की हैश फंकशन तकनीक है जैसे कि जब हैश टेबल का आकार बदला जाता है इस प्रकार $$n/m$$ कीज को औसतन पुनः मैप करने की आवश्यकता है इस प्रकार $$n$$ कीज की संख्या है और $$m$$ स्लॉट की संख्या है. इसके विपरीत, अधिकांश पारंपरिक हैश टेबलओं में, सरणी स्लॉट की संख्या में बदलाव के कारण लगभग सभी कीज को फिर से मैप करना पड़ता है क्योंकि कीज और स्लॉट्स के बीच मैपिंग को मॉड्यूलर अंकगणित द्वारा परिभाषित किया जाता है।

इतिहास
सुसंगत हैशिंग शब्द डेविड कार्गर एट अल द्वारा प्रस्तुत किया गया था। एमआईटी में वितरित कैश में उपयोग के लिए, विशेष रूप से वर्ल्ड वाइड वेब के लिए। कंप्यूटिंग के सिद्धांत पर संगोष्ठी में 1997 के इस अकादमिक पेपर ने वेब सर्वर की बदलती जनसंख्या के बीच अनुरोधों को वितरित करने के विधि के रूप में कंसिस्टेंट हैशिंग शब्द को प्रस्तुत किया था। फिर प्रत्येक स्लॉट को वितरित सिस्टम या क्लस्टर में सर्वर द्वारा दर्शाया जाता है। केवल सर्वर को जोड़ने और सर्वर को हटाने (स्केलेबिलिटी या आउटेज के समय) की आवश्यकता होती है इस प्रकार $$num\_keys/num\_slots$$ स्लॉट की संख्या (अर्थात सर्वर) बदलने पर आइटमों को फिर से फेरबदल किया जाना चाहिए। लेखक रैखिक हैशिंग और अनुक्रमिक सर्वर जोड़ और निष्कासन को संभालने की इसकी क्षमता का उल्लेख करते हैं, जबकि कंसिस्टेंट हैशिंग सर्वर को इच्छानुसार क्रम में जोड़ने और हटाने की अनुमति देता है। वितरित हैश टेबल जैसे पीयर-टू-पीयर या पीयर-टू-पीयर नेटवर्क में फ़ाइल का ट्रैक रखने की तकनीकी चुनौती को संबोधित करने के लिए बाद में पेपर को फिर से तैयार किया गया था। टेराडाटा ने 1986 में जारी अपने वितरित डेटाबेस में इस तकनीक का उपयोग किया था, चूँकि उन्होंने इस शब्द का उपयोग नहीं किया था। ठीक इसी उद्देश्य को पूरा करने के लिए टेराडेटा अभी भी हैश टेबल की अवधारणा का उपयोग करता है। स्मार्ट टेक्नोलॉजीज की स्थापना 1998 में वैज्ञानिक डेनियल लेविन और एफ. थॉमसन लीटन (कंसिस्टेंट हैशिंग गढ़ने वाले लेख के सह-लेखक) द्वारा की गई थी। अकामाई के पदार्थ वितरण नेटवर्क में, कंसिस्टेंट हैशिंग का उपयोग सर्वर के क्लस्टर के अन्दर लोड को संतुलित करने के लिए किया जाता है, जबकि वितरित हैश टेबल एल्गोरिदम का उपयोग क्लस्टर में लोड को संतुलित करने के लिए किया जाता है। इस प्रकार बड़े वेब अनुप्रयोगों में आंशिक सिस्टम विफलताओं के प्रभाव को कम करने के लिए कंसिस्टेंट हैशिंग का भी उपयोग किया गया है जिससे सिस्टम-व्यापी विफलता के बिना सशक्त कैशिंग प्रदान की जा सकता है। कंसिस्टेंट हैशिंग वितरित हैश टेबलओं (डीएचटी) की आधारशिला भी है, जो नोड्स के वितरित सेट में कीस्पेस को विभाजित करने के लिए हैश मानों को नियोजित करती है, फिर कनेक्टेड नोड्स के ओवरले नेटवर्क का निर्माण करती है जो कीज द्वारा कुशल नोड पुनर्प्राप्ति प्रदान करती है।

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

मूलभूत तकनीक
लोड संतुलन (कंप्यूटिंग) की समस्या में, उदाहरण के लिए, जब बाइनरी को इनमें से किसी $$n$$ कंप्यूटर क्लस्टर पर सर्वर को नियुक्त जाना होता है, मानक हैश फ़ंक्शन का उपयोग इस तरह से किया जा सकता है कि हम उस बीएलओबी के लिए हैश मान की गणना करते हैं, यह मानते हुए कि हैश का परिणामी $$\beta$$ मान है, हम सर्वरों की संख्या के साथ मॉड्यूलर अंकगणित करते हैं ($$n$$ इस स्थिति में) उस सर्वर को निर्धारित करने के लिए जिसमें हम $$\zeta = \beta\ \%\ n$$ ब्लॉब रख सकते हैं: इसलिए बीएलओबी को सर्वर में रखा जाएगा $$\text{server ID}$$ का उत्तराधिकारी है इस स्थिति में $$\zeta$$ चूँकि, जब किसी सर्वर को आउटेज या स्केलिंग के समय जोड़ा या हटाया जाता है (जब $$n$$ परिवर्तन), हैश टेबल डायनेमिक आकार बदलने के कारण प्रत्येक सर्वर में सभी बीएलओबी को पुन: असाइन और स्थानांतरित किया जाना चाहिए, किन्तु यह ऑपरेशन महंगा है।

जब किसी सर्वर को पूरे क्लस्टर में जोड़ा या हटाया जाता है, जिससे प्रत्येक ब्लॉब को पुन: असाइन करने की समस्या से बचने के लिए कंसिस्टेंट हैशिंग को डिज़ाइन किया गया था। केंद्रीय विचार यह है कि, हम हैश फ़ंक्शन का उपयोग करते हैं जो सामान्यतः बीएलओबी और सर्वर दोनों को यूनिट सर्कल में यादृच्छिक $$2\pi$$ रेडियंस. रूप से मैप करता है उदाहरण के लिए, $$\zeta = \Phi\ \%\ 360$$ (जहाँ $$\Phi$$ बीएलओबी या सर्वर के पहचानकर्ता का हैश है, जैसे आईपी पता या सार्वभौमिक रूप से अद्वितीय पहचानकर्ता)। फिर प्रत्येक बीएलओबी को अगले सर्वर को नियुक्त जाता है जो सर्कल पर दक्षिणावर्त क्रम में दिखाई देता है। सामान्यतः, बाइनरी सर्च एल्गोरिदम या रैखिक सर्च का उपयोग उस विशेष बीएलओबी को रखने के लिए किसी स्थान या सर्वर को सर्चने के लिए किया जाता है इस प्रकार $$O(\log N)$$ या $$O(N)$$ क्रमशः समष्टिएँ; और प्रत्येक पुनरावृत्ति में, जो दक्षिणावर्त विधि से होता है, ऑपरेशन $$\zeta\ \le\ \Psi$$ (जहाँ $$\Psi$$ क्लस्टर के अन्दर सर्वर का मान है) बीएलओबी लगाने के लिए सर्वर को सर्चने के लिए किया जाता है। यह सर्वरों को बीएलओबी का समान वितरण प्रदान करता है। किन्तु, अधिक महत्वपूर्ण बात यह है कि यदि कोई सर्वर विफल हो जाता है और सर्कल से हटा दिया जाता है, तो केवल बीएलओबी जो विफल सर्वर पर मैप किए गए थे, उन्हें दक्षिणावर्त क्रम में अगले सर्वर पर पुन: असाइन करने की आवश्यकता होती है। इसी तरह, यदि कोई नया सर्वर जोड़ा जाता है, जिससे इसे यूनिट सर्कल में जोड़ा जाता है, और केवल उस सर्वर पर मैप किए गए बीएलओबी को पुन: असाइन करने की आवश्यकता होती है।

महत्वपूर्ण रूप से, जब कोई सर्वर जोड़ा या हटाया जाता है, जिससे अधिकांश बीएलओबी अपने पूर्व सर्वर असाइनमेंट को बनाए रखते हैं, और इसके अतिरिक्त $$n^{th}$$ सर्वर ही कारण बनता है इस प्रकार $$1/n$$ स्थानांतरित करने के लिए बीएलओबी का अंश यद्यपि क्लस्टर में कैश सर्वरों में बीएलओबी को स्थानांतरित करने की प्रक्रिया संदर्भ पर निर्भर करती है, सामान्यतः, नया जोड़ा गया कैश सर्वर अपने उत्तराधिकारी की पहचान करता है और सभी बीएलओबी को स्थानांतरित करता है, जिनकी मैपिंग इस सर्वर से संबंधित है (अर्थात जिसका हैश मान इससे कम है) नया सर्वर), इससे चूँकि, वेब कैशिंग के स्थिति में, अधिकांश कार्यान्वयन में कैश्ड बीएलओबी अधिक छोटा मानते हुए, इसे स्थानांतरित करने या कॉपी करने की कोई भागीदारी नहीं होती है। जब कोई अनुरोध नए जोड़े गए कैश सर्वर से कोलिसन करता है, जिससे कैश (कंप्यूटिंग) कैश-मिस होता है और वास्तविक वेब सर्वर से अनुरोध किया जाता है और भविष्य के अनुरोधों के लिए ब्लॉब को स्थानीय रूप से कैश किया जाता है। पहले उपयोग किए गए कैश सर्वर पर अनावश्यक बीएलओबी कैश प्रतिस्थापन नीतियों के अनुसार हटा दिए जाते है।

कार्यान्वयन
माना $$h_{b}(x)$$ और $$h_{s}(x)$$ क्रमशः बीएलओबी और सर्वर के विशिष्ट पहचानकर्ता के लिए उपयोग किए जाने वाले हैश फ़ंक्शन होंता है। व्यवहार में, गतिशील रूप से बनाए रखने के लिए बाइनरी सर्च ट्री (बीएसटी) का उपयोग किया जाता है इस प्रकार $$\text{server ID}$$ क्लस्टर या हैशिंग के अन्दर, और बीएसटी के अन्दर उत्तराधिकारी या न्यूनतम सर्चने के लिए, ट्री परिभ्रमण का उपयोग किया जाता है।
 * इन्सर्टिंग $$x$$ क्लस्टर में
 * माना $$\beta$$ ब्लॉब का हैश मान इस प्रकार हो कि, $$h_{b}(x)=\beta\ \%\ 360$$ जहाँ $$x \in \mathrm{BLOB}$$ और $$h_{b}(x)=\zeta$$. दर्ज करना $$x$$, का उत्तराधिकारी सर्चें $$\zeta$$ के बीएसटी में $$\text{server ID}$$एस। यदि $$\zeta$$ सभी से बड़ा है $$\text{server ID}$$ s, बीएलओबी को सबसे छोटे सर्वर में रखा गया है $$\text{server ID}$$ कीमत।


 * क्लस्टर से $$x$$ हटाना
 * $$\zeta$$ के उत्तराधिकारी का पता लगाएं बीएसटी में, रिटर्न से बीएलओबी हटा दें $$\text{server ID}$$. यदि $$\zeta$$ इसका कोई उत्तराधिकारी नहीं है, सबसे छोटे से बीएलओबी हटा दें $$\text{server ID}$$s है।


 * क्लस्टर में सर्वर डालें
 * माना $$\Phi$$ सर्वर के पहचानकर्ता का हैश मान इस प्रकार हो, $$h_{s}(x)=\Phi\ \%\ 360$$ जहाँ $$x \in \{\text{IP address, UUID}\}$$ और $$h_{s}(x)=\theta$$. उन सभी बीएलओबी को स्थानांतरित करें, जिनका हैश मान $$\theta$$ इससे छोटा है, सर्वर से जिसका $$\text{server ID}$$ का उत्तराधिकारी $$\theta$$ है . यदि $$\theta$$ सभी में सबसे बड़ा है $$\text{server ID}$$एस, प्रासंगिक बीएलओबी को सबसे छोटे से स्थानांतरित करें $$\text{server ID}$$ $$\theta$$ में है.


 * क्लस्टर से सर्वर हटाएं
 * $$\theta$$ के उत्तराधिकारी का पता लगाएं बीएसटी में, बीएलओबी को यहां से हटाएं $$\theta$$ इसके उत्तराधिकारी सर्वर में यदि $$\theta$$ इसका कोई उत्तराधिकारी नहीं है, बीएलओबी को सबसे छोटे में ले जाएं $$\text{server ID}$$ s है।

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

==व्यावहारिक विस्तार                                                                                                                                                                                                                                                                                ==

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

रेनडेज़वस हैशिंग और अन्य विकल्पों के साथ तुलना
1996 में डिज़ाइन किया गया रेंडेज़वस हैशिंग सरल और अधिक सामान्य तकनीक है, और सेट पर पूरी तरह से वितरित समझौते की अनुमति देता है इस प्रकार $$k$$ संभावित सेट में से विकल्प $$n$$ विकल्प. रेंडीज़वस हैशिंग कंसिस्टेंट हैशिंग के साथ तुलना कि कंसिस्टेंट हैशिंग रेंडीज़वस हैशिंग का विशेष स्थिति है। इसकी सरलता और व्यापकता के कारण, कई अनुप्रयोगों में कंसिस्टेंट हैशिंग के स्थान पर अब मिलनसार हैशिंग का उपयोग किया जा रहा है।

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

समष्टि
सी प्रकार $$O(K/N)$$ h> कीज के पुनर्वितरण के लिए औसत निवेश है और $$O(\log N)$$ कंसिस्टेंट हैशिंग के लिए समष्टि इस तथ्य से आती है कि रिंग पर अगले नोड को सर्चने के लिए नोड्स कोणों के बीच बाइनरी सर्च एल्गोरिदम की आवश्यकता होती है।

उदाहरण
कंसिस्टेंट हैशिंग उपयोग के ज्ञात उदाहरणों में सम्मिलित हैं: == संदर्भ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              ==
 * काउचबेस स्वचालित डेटा विभाजन
 * ओपनस्टैक या ओपनस्टैक की ऑब्जेक्ट स्टोरेज सर्विस स्विफ्ट
 * अमेज़ॅन की संग्रहण सिस्टम डायनमो (संग्रहण सिस्टम) का विभाजन घटक
 * अपाचे कैसेंड्रा में डेटा विभाजन
 * वोल्डेमॉर्ट में डेटा विभाजन (वितरित डेटा स्टोर)
 * अक्का (टूलकिट) का सुसंगत हैशिंग राउटर
 * रिआक, वितरित कीज-मूल्य डेटाबेस
 * ग्लस्टर, नेटवर्क-अटैच्ड स्टोरेज फ़ाइल सिस्टम
 * अकामाई टेक्नोलॉजीज पदार्थ वितरण नेटवर्क
 * डिस्कॉर्ड (सॉफ़्टवेयर) चैट एप्लिकेशन
 * कॉर्ड (पीयर-टू-पीयर) एल्गोरिदम



बाहरी संबंध

 * Understanding कंसिस्टेंट हैशिंग
 * कंसिस्टेंट हैशिंग by Michael Nielsen on June 3, 2009
 * कंसिस्टेंट हैशिंग, Danny Lewin, and the Creation of Akamai
 * Jump कंसिस्टेंट हैशिंग: A Fast, Minimal Memory, Consistent Hash Algorithm
 * Rendezvous Hashing: an alternative to कंसिस्टेंट हैशिंग
 * Implementations in various languages:
 * C
 * C++
 * C#
 * Erlang
 * Go
 * Java
 * PHP
 * Ruby
 * Python
 * Python (again)
 * Perl
 * Perl6