डबल हैशिंग: Difference between revisions
No edit summary |
No edit summary |
||
(5 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
'''डबल हैशिंग''' एक [[कंप्यूटर प्रोग्रामिंग]] तकनीक है जिसका उपयोग कोलिजन होने पर ऑफसेट के रूप में | '''डबल हैशिंग''' एक [[कंप्यूटर प्रोग्रामिंग]] तकनीक है जिसका उपयोग कोलिजन होने पर ऑफसेट के रूप में कीय के डबल हैश का उपयोग करके, हैश कोलिजन को हल करने के लिए [[हैश तालिका|हैश टेबल]] ओं में ओपेन एड्रेसिंग के साथ संयोजन में किया जाता है। [[ खुला संबोधन |ओपेन एड्रेसिंग]] के साथ डबल हैशिंग एक टेबल पर एक मौलिक डेटा संरचना <math>T</math> है . | ||
डबल हैशिंग तकनीक | डबल हैशिंग तकनीक टेबल में एक सूचकांक के रूप में एक हैश मान का उपयोग करती है और तब तक बार-बार एक अंतराल को आगे बढ़ाती है जब तक कि डिसायर्ड मान स्थित न हो जाए, एक रिक्त स्थान न पहुंच जाए, या पूरी टेबल खोज न ली जाए; किंतु यह अंतराल एक दूसरे, इंडीपेनडेंट [[हैश फंकशन]] द्वारा निर्धारित किया जाता है। [[रैखिक जांच|लीनियर प्रोबिंग]] और [[द्विघात जांच|क्ववार्डेटिक]] [[रैखिक जांच|प्रोबिंग]] के वैकल्पिक कोलिजन-रिज़ॉल्यूशन विधियों के विपरीत, अंतराल डेटा पर निर्भर करता है, जिससे एक ही स्थान पर मैपिंग मानों में अलग-अलग बकेट अनुक्रम होंता है; जिसमे यह बार-बार होने वाले कोलिजनों और क्लस्टरिंग के प्रभावों को कम करता है। | ||
दो यादृच्छिक, समान और | दो यादृच्छिक, समान और इंडीपेनडेंट हैश फ़ंक्शंस <math>h_1</math> और <math>h_2</math>, को देखते हुए, <math>|T|</math> की हैश टेबल में मान <math>k</math> के लिए बकेट अनुक्रम में <math>i</math> स्थान बकेट है: <math>h(i,k)=(h_1(k) + i \cdot h_2(k))\bmod|T|.</math> समान्यत:, <math>h_1</math> और <math>h_2</math> को सार्वभौमिक हैश फ़ंक्शंस के एक सेट से चुना जाता है; <math>\{0,|T|-1\}</math> की सीमा के लिए <math>h_1</math> का चयन किया जाता है और <math>\{1,|T|-1\}</math> की सीमा के लिए<math>h_2</math> का चयन किया जाता है। डबल हैशिंग एक रेनडम डिस्ट्रीबुसन का अनुमान लगाता है; अधिक स्पष्ट रूप से, पेअर-वाइस इंडीपेनडेंट हैश फ़ंक्शन <math>(n/|T|)^2</math> की संभावना उत्पन्न करते हैं कि कीय की कोई भी पेअर समान बकेट अनुक्रम का पालन करेगी। | ||
== h<sub>2</sub>(k) का चयन== | == h<sub>2</sub>(k) का चयन== | ||
द्वितीयक हैश फ़ंक्शन <math>h_2(k)</math> कई विशेषताएं होनी चाहिए: | द्वितीयक हैश फ़ंक्शन <math>h_2(k)</math> कई विशेषताएं होनी चाहिए: | ||
*इससे कभी भी शून्य का सूचकांक प्राप्त नहीं होना चाहिए | *इससे कभी भी शून्य का सूचकांक प्राप्त नहीं होना चाहिए | ||
*इसे पूरी | *इसे पूरी टेबल पर घूमना चाहिए | ||
*यह गणना करने में बहुत तेज़ होना चाहिए | *यह गणना करने में बहुत तेज़ होना चाहिए | ||
*यह | *यह पेअर-वाइस <math>h_1(k)</math> से इंडीपेनडेंट होना चाहिए। | ||
*<math>h_2</math> की वितरण विशेषताएँ अप्रासंगिक हैं। यह एक यादृच्छिक-संख्या जनरेटर के समान है। | *<math>h_2</math> की वितरण विशेषताएँ अप्रासंगिक हैं। यह एक यादृच्छिक-संख्या जनरेटर के समान है। | ||
* सभी <math>h_2(k)</math> |T| के लिए अपेक्षाकृत अभाज्य बनें हो। | * सभी <math>h_2(k)</math> |T| के लिए अपेक्षाकृत अभाज्य बनें हो। | ||
Line 26: | Line 26: | ||
== विश्लेषण == | == विश्लेषण == | ||
मान लीजिए कि <math>T</math> में संग्रहीत | मान लीजिए कि <math>T</math> में संग्रहीत अवयव ं की संख्या <math>n</math> है, तो <math>T</math> का लोड कारक <math>\alpha = n/|T|</math> है। अर्थात्, एक डबल हैशिंग टेबल <math>T</math> बनाने के लिए दो सार्वभौमिक हैश फ़ंक्शन <math>h_1</math> और <math>h_2</math> का चयन करके यादृच्छिक रूप से, समान रूप से और इंडीपेनडेंट रूप से प्रारंभ करें। सभी अवयव को<math>h_1</math> और <math>h_2</math>. का उपयोग करके डबल हैशिंग द्वारा <math>T</math> में रखा गया है। एक कीय <math>k</math> देते हुए, <math>(i+1)</math> हैश स्थान की गणना निम्न द्वारा की जाती है: | ||
<math display=block> h(i,k) = ( h_1(k) + i \cdot h_2(k) ) \bmod |T|.</math> | <math display=block> h(i,k) = ( h_1(k) + i \cdot h_2(k) ) \bmod |T|.</math> | ||
मान लें कि <math>T</math> का लोड कारक | मान लें कि <math>T</math> का लोड कारक <math>\alpha: 1 > \alpha > 0</math> है। ब्रैडफोर्ड और कटेहाकिस<ref>{{citation | ||
| last1 = Bradford | first1 = Phillip G. | | last1 = Bradford | first1 = Phillip G. | ||
| last2 = Katehakis | first2 = Michael N. | author2-link = Michael N. Katehakis | | last2 = Katehakis | first2 = Michael N. | author2-link = Michael N. Katehakis | ||
Line 43: | Line 43: | ||
| archive-url = https://web.archive.org/web/20160125172602/http://phillipbradford.com/papers/AProbStudyExpandersAndHashing.pdf | | archive-url = https://web.archive.org/web/20160125172602/http://phillipbradford.com/papers/AProbStudyExpandersAndHashing.pdf | ||
| archive-date = 2016-01-25 | | archive-date = 2016-01-25 | ||
}}.</ref> ने <math>T</math> में असफल खोज के लिए जांचों की अपेक्षित संख्या दिखाई, फिर भी इन आरंभिक रूप से चुने गए हैश फ़ंक्शंस का उपयोग करते हुए, इसकी | }}.</ref> ने <math>T</math> में असफल खोज के लिए जांचों की अपेक्षित संख्या दिखाई, फिर भी इन आरंभिक रूप से चुने गए हैश फ़ंक्शंस का उपयोग करते हुए, इसकी सावधानी किए बिना <math>\tfrac{1}{1-\alpha}</math> है इनपुट का वितरण. हैश फ़ंक्शंस की पेअर-वाइस इंडीपेनडेंट सफिसिअस है। | ||
ओपन एड्रेसिंग के अन्य सभी रूपों की तरह, डबल हैशिंग रैखिक हो जाती है क्योंकि हैश | ओपन एड्रेसिंग के अन्य सभी रूपों की तरह, डबल हैशिंग रैखिक हो जाती है क्योंकि हैश टेबल अधिकतम क्षमता तक पहुंचती है। सामान्य अनुमान टेबल लोडिंग को क्षमता के 75% तक सीमित करना है। अंततः अन्य सभी ओपन एड्रेसिंग योजनाओं की अनुरूप बड़े आकार में पुनः प्रयास करना आवश्यक होगा। | ||
== वेरिएंट == | == वेरिएंट == | ||
Line 62: | Line 62: | ||
=== ट्रिपल हैशिंग === | === ट्रिपल हैशिंग === | ||
हैश फ़ंक्शन में एक | हैश फ़ंक्शन में एक क्ववार्डेटिक शब्द <math>i^2,</math><ref name="Kirsch08">{{cite journal | ||
|title=Less Hashing, Same Performance: Building a Better Bloom Filter | |title=Less Hashing, Same Performance: Building a Better Bloom Filter | ||
|first1=Adam |last1=Kirsch |first2=Michael |last2=Mitzenmacher |authorlink2=Michael Mitzenmacher | |first1=Adam |last1=Kirsch |first2=Michael |last2=Mitzenmacher |authorlink2=Michael Mitzenmacher | ||
Line 68: | Line 68: | ||
|date=September 2008 |doi=10.1002/rsa.20208 |citeseerx=10.1.1.152.579 | |date=September 2008 |doi=10.1002/rsa.20208 |citeseerx=10.1.1.152.579 | ||
|url=https://www.eecs.harvard.edu/~michaelm/postscripts/rsa2008.pdf | |url=https://www.eecs.harvard.edu/~michaelm/postscripts/rsa2008.pdf | ||
}}</ref> <math>i(i+1)/2</math> (एक त्रिकोणीय संख्या) या यहां तक कि <math>i^2 \cdot h_3(x)</math> (ट्रिपल हैशिंग)<ref>Alternatively defined with the triangular number, as in Dillinger 2004.</ref> जोड़ने से हैश फ़ंक्शन में कुछ | }}</ref> <math>i(i+1)/2</math> (एक त्रिकोणीय संख्या) या यहां तक कि <math>i^2 \cdot h_3(x)</math> (ट्रिपल हैशिंग)<ref>Alternatively defined with the triangular number, as in Dillinger 2004.</ref> जोड़ने से हैश फ़ंक्शन में कुछ सीमा तक सुधार होता है<ref name=Kirsch08/> किंतु यह समस्या ठीक नहीं होती है; यदि : | ||
: <math>h_1(y) = h_1(x) + k \cdot h_2(x) + k^2 \cdot h_3(x),</math> | : <math>h_1(y) = h_1(x) + k \cdot h_2(x) + k^2 \cdot h_3(x),</math> | ||
: <math>h_2(y) = -h_2(x) - 2k \cdot h_3(x),</math> और | : <math>h_2(y) = -h_2(x) - 2k \cdot h_3(x),</math> और | ||
Line 83: | Line 83: | ||
=== | === एनहांस्ड डबल हैशिंग === | ||
एक घन शब्द | एक घन शब्द <math>i^3</math><ref name=Kirsch08/> या <math>(i^3-i)/6</math> (एक चतुष्फलकीय संख्या) जोड़ने से<ref name="Dillinger04" /> समस्या हल हो जाती है, एक तकनीक जिसे एन्हांस्ड डबल हैशिंग के रूप में जाना जाता है। इसकी गणना फॉरवर्ड डिफरेंसिंग द्वारा कुशलतापूर्वक की जा सकती है: | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
struct key; /// Opaque | struct key; /// Opaque | ||
Line 108: | Line 108: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 125: | Line 126: | ||
*[http://www.cs.pitt.edu/~kirk/cs1501/animations/Hashing.html Hash Table Animation] | *[http://www.cs.pitt.edu/~kirk/cs1501/animations/Hashing.html Hash Table Animation] | ||
*[https://github.com/attractivechaos/klib klib] a C library that includes double hashing functionality. | *[https://github.com/attractivechaos/klib klib] a C library that includes double hashing functionality. | ||
[[Category:Created On 11/07/2023]] | [[Category:Created On 11/07/2023]] | ||
[[Category:Machine Translated Page]] | |||
[[Category:Pages with script errors]] | |||
[[Category:Templates Vigyan Ready]] | |||
[[Category:एल्गोरिदम खोजें]] | |||
[[Category:हैशिंग]] |
Latest revision as of 11:02, 27 July 2023
डबल हैशिंग एक कंप्यूटर प्रोग्रामिंग तकनीक है जिसका उपयोग कोलिजन होने पर ऑफसेट के रूप में कीय के डबल हैश का उपयोग करके, हैश कोलिजन को हल करने के लिए हैश टेबल ओं में ओपेन एड्रेसिंग के साथ संयोजन में किया जाता है। ओपेन एड्रेसिंग के साथ डबल हैशिंग एक टेबल पर एक मौलिक डेटा संरचना है .
डबल हैशिंग तकनीक टेबल में एक सूचकांक के रूप में एक हैश मान का उपयोग करती है और तब तक बार-बार एक अंतराल को आगे बढ़ाती है जब तक कि डिसायर्ड मान स्थित न हो जाए, एक रिक्त स्थान न पहुंच जाए, या पूरी टेबल खोज न ली जाए; किंतु यह अंतराल एक दूसरे, इंडीपेनडेंट हैश फंकशन द्वारा निर्धारित किया जाता है। लीनियर प्रोबिंग और क्ववार्डेटिक प्रोबिंग के वैकल्पिक कोलिजन-रिज़ॉल्यूशन विधियों के विपरीत, अंतराल डेटा पर निर्भर करता है, जिससे एक ही स्थान पर मैपिंग मानों में अलग-अलग बकेट अनुक्रम होंता है; जिसमे यह बार-बार होने वाले कोलिजनों और क्लस्टरिंग के प्रभावों को कम करता है।
दो यादृच्छिक, समान और इंडीपेनडेंट हैश फ़ंक्शंस और , को देखते हुए, की हैश टेबल में मान के लिए बकेट अनुक्रम में स्थान बकेट है: समान्यत:, और को सार्वभौमिक हैश फ़ंक्शंस के एक सेट से चुना जाता है; की सीमा के लिए का चयन किया जाता है और की सीमा के लिए का चयन किया जाता है। डबल हैशिंग एक रेनडम डिस्ट्रीबुसन का अनुमान लगाता है; अधिक स्पष्ट रूप से, पेअर-वाइस इंडीपेनडेंट हैश फ़ंक्शन की संभावना उत्पन्न करते हैं कि कीय की कोई भी पेअर समान बकेट अनुक्रम का पालन करेगी।
h2(k) का चयन
द्वितीयक हैश फ़ंक्शन कई विशेषताएं होनी चाहिए:
- इससे कभी भी शून्य का सूचकांक प्राप्त नहीं होना चाहिए
- इसे पूरी टेबल पर घूमना चाहिए
- यह गणना करने में बहुत तेज़ होना चाहिए
- यह पेअर-वाइस से इंडीपेनडेंट होना चाहिए।
- की वितरण विशेषताएँ अप्रासंगिक हैं। यह एक यादृच्छिक-संख्या जनरेटर के समान है।
- सभी |T| के लिए अपेक्षाकृत अभाज्य बनें हो।
वास्तव में:
- यदि विभाजन हैशिंग का उपयोग दोनों कार्यों के लिए किया जाता है, तो भाजक को अभाज्य के रूप में चुना जाता है।
- यदि टी 2 की शक्ति है, तो पहली और अंतिम आवश्यकताएं समान्यत: को सदैव एक विषम संख्या देकर संतुष्ट की जाती हैं। इसका दुष्परिणाम यह है कि एक व्यर्थ बिट के कारण कोलिजन की संभावना दोगुनी हो जाती है।[1]
विश्लेषण
मान लीजिए कि में संग्रहीत अवयव ं की संख्या है, तो का लोड कारक है। अर्थात्, एक डबल हैशिंग टेबल बनाने के लिए दो सार्वभौमिक हैश फ़ंक्शन और का चयन करके यादृच्छिक रूप से, समान रूप से और इंडीपेनडेंट रूप से प्रारंभ करें। सभी अवयव को और . का उपयोग करके डबल हैशिंग द्वारा में रखा गया है। एक कीय देते हुए, हैश स्थान की गणना निम्न द्वारा की जाती है:
ओपन एड्रेसिंग के अन्य सभी रूपों की तरह, डबल हैशिंग रैखिक हो जाती है क्योंकि हैश टेबल अधिकतम क्षमता तक पहुंचती है। सामान्य अनुमान टेबल लोडिंग को क्षमता के 75% तक सीमित करना है। अंततः अन्य सभी ओपन एड्रेसिंग योजनाओं की अनुरूप बड़े आकार में पुनः प्रयास करना आवश्यक होगा।
वेरिएंट
पीटर डिलिंजर की पीएचडी थीसिस[3] बताते हैं कि डबल हैशिंग अवांछित समतुल्य हैश फ़ंक्शन उत्पन्न करता है जब हैश फ़ंक्शन को एक सेट के रूप में माना जाता है, जैसा कि ब्लूम फिल्टर में होता है: यदि और , तब और हैश के सेट समरूप हैं। इससे कोलिजन की संभावना अपेक्षा से दोगुनी हो जाती है .
इसके अतिरिक्त बड़ी संख्या में अधिकतर ओवरलैपिंग हैश सेट भी हैं; यदि और , तब , और अतिरिक्त हैश मानों की तुलना करना (सीमा का विस्तार करना)। ) कोई सहायता नहीं है.
ट्रिपल हैशिंग
हैश फ़ंक्शन में एक क्ववार्डेटिक शब्द [4] (एक त्रिकोणीय संख्या) या यहां तक कि (ट्रिपल हैशिंग)[5] जोड़ने से हैश फ़ंक्शन में कुछ सीमा तक सुधार होता है[4] किंतु यह समस्या ठीक नहीं होती है; यदि :
- और
तब
एनहांस्ड डबल हैशिंग
एक घन शब्द [4] या (एक चतुष्फलकीय संख्या) जोड़ने से[1] समस्या हल हो जाती है, एक तकनीक जिसे एन्हांस्ड डबल हैशिंग के रूप में जाना जाता है। इसकी गणना फॉरवर्ड डिफरेंसिंग द्वारा कुशलतापूर्वक की जा सकती है:
struct key; /// Opaque
/// Use other data types when needed. (Must be unsigned for guaranteed wrapping.)
extern unsigned int h1(struct key const *), h2(struct key const *);
/// Calculate k hash values from two underlying hash functions
/// h1() and h2() using enhanced double hashing. On return,
/// hashes[i] = h1(x) + i*h2(x) + (i*i*i - i)/6.
/// Takes advantage of automatic wrapping (modular reduction)
/// of unsigned types in C.
void ext_dbl_hash(struct key const *x, unsigned int hashes[], unsigned int n)
{
unsigned int a = h1(x), b = h2(x), i;
for (i = 0; i < n; i++) {
hashes[i] = a;
a += b; // Add quadratic difference to get cubic
b += i; // Add linear difference to get quadratic
// i++ adds constant difference to get linear
}
}
कोलिजन की समस्या को सुधारने के अतिरिक्त, बढ़ी हुई डबल हैशिंग के गुणों पर डबल-हैशिंग के संख्यात्मक प्रतिबंधों को भी हटा देती है, जिससे संपत्ति के समान हैश फ़ंक्शन को के समान (किंतु फिर भी स्वतंत्र) होने की अनुमति मिलती है। जिससे इसका उपयोग किया गया है।[1]
यह भी देखें
संदर्भ
- ↑ 1.0 1.1 1.2 Dillinger, Peter C.; Manolios, Panagiotis (November 15–17, 2004). Bloom Filters in Probabilistic Verification (PDF). 5h International Conference on Formal Methods in Computer Aided Design (FMCAD 2004). Austin, Texas. CiteSeerX 10.1.1.119.628. doi:10.1007/978-3-540-30494-4_26.
- ↑ Bradford, Phillip G.; Katehakis, Michael N. (April 2007), "A Probabilistic Study on Combinatorial Expanders and Hashing" (PDF), SIAM Journal on Computing, 37 (1): 83–111, doi:10.1137/S009753970444630X, MR 2306284, archived from the original (PDF) on 2016-01-25.
- ↑ Dillinger, Peter C. (December 2010). Adaptive Approximate State Storage (PDF) (PhD thesis). Northeastern University. pp. 93–112.
- ↑ 4.0 4.1 4.2 Kirsch, Adam; Mitzenmacher, Michael (September 2008). "Less Hashing, Same Performance: Building a Better Bloom Filter" (PDF). Random Structures and Algorithms. 33 (2): 187–218. CiteSeerX 10.1.1.152.579. doi:10.1002/rsa.20208.
- ↑ Alternatively defined with the triangular number, as in Dillinger 2004.
बाहरी संबंध
- How Caching Affects Hashing by Gregory L. Heileman and Wenbin Luo 2005.
- Hash Table Animation
- klib a C library that includes double hashing functionality.