आमतौर पर एक साधारण हैश फ़ंक्शन इनपुट के "घटक भागों" (एक स्ट्रिंग के मामले में वर्ण) को ले कर काम करता है, और उन्हें कुछ स्थिरांक की शक्तियों से गुणा करता है, और उन्हें कुछ पूर्णांक प्रकार में एक साथ जोड़ता है। उदाहरण के लिए एक विशिष्ट (हालांकि विशेष रूप से अच्छा नहीं) एक स्ट्रिंग का हैश हो सकता है:
(first char) + k * (second char) + k^2 * (third char) + ...
फिर यदि सभी पहले समान चार वाले तार का एक गुच्छा खिलाया जाता है, तो परिणाम सभी एक ही modulo k होंगे, कम से कम जब तक पूर्णांक प्रकार के ओवरफ्लो नहीं होंगे।
[एक उदाहरण के रूप में, जावा का स्ट्रिंग हैशकोड इसी के समान है - यह वर्णों को उल्टा क्रम देता है, k = 31 के साथ। तो आप स्ट्राइक रिलेशनशिप मोडुलो 31 को स्ट्रिंग्स के बीच में ले जाते हैं जो उसी तरह से समाप्त होते हैं, और स्ट्राइकिंग रिलेशनशिप मोडुलो 2 ^ 32 स्ट्रिंग्स के बीच जो अंत के पास के समान हैं। यह हैशटेबल व्यवहार को गंभीर रूप से गड़बड़ नहीं करता है।]
एक हैशटेबल हैश के मापांक को बाल्टियों की संख्या पर ले जाकर काम करता है।
यह हैशटेबल में महत्वपूर्ण है कि संभावित मामलों के लिए टक्कर का उत्पादन न करें, क्योंकि टक्कर हैशटेबल की दक्षता को कम करती है।
अब, मान लीजिए कि किसी ने मानों की एक पूरी गुच्छा एक हैशटेबल में डाल दिया है, जो वस्तुओं के बीच कुछ संबंध रखता है, जैसे कि सभी का पहला चरित्र है। यह एक काफी अनुमानित पूर्वानुमान पैटर्न है, मैं कहूंगा, इसलिए हम नहीं चाहते कि यह बहुत अधिक टकराव पैदा करे।
यह पता चला है कि "गणित की प्रकृति के कारण", यदि हैश में निरंतर उपयोग किया जाता है, और बाल्टियों की संख्या मैथुन होती है , तो कुछ सामान्य मामलों में टकराव को कम किया जाता है। यदि वे नकल नहीं कर रहे हैं, तो इनपुट के बीच कुछ काफी सरल संबंध हैं जिनके लिए टकराव को कम नहीं किया जाता है। सभी हैश समान कारक के समान निकलते हैं, जिसका अर्थ है कि वे सभी बाल्टी के 1 / n वें भाग में गिरेंगे जिसका सामान्य कारक है। आपको कई बार टकराव के रूप में n मिलता है, जहां n सामान्य कारक है। चूंकि n कम से कम 2 है, मैं कहूंगा कि यह सामान्य उपयोग के मामले में कम से कम दो बार सामान्य रूप से कई टकराव उत्पन्न करने के लिए अस्वीकार्य है। यदि कुछ उपयोगकर्ता बाल्टी में हमारे वितरण को तोड़ने जा रहे हैं, तो हम चाहते हैं कि यह एक अजीब दुर्घटना हो, न कि कुछ सरल पूर्वानुमान।
अब, हैशटेबल कार्यान्वयन स्पष्ट रूप से उन पर लगाए गए वस्तुओं पर कोई नियंत्रण नहीं है। वे उन्हें संबंधित होने से नहीं रोक सकते। तो यह सुनिश्चित करने के लिए बात यह है कि स्थिर और बाल्टी मायने रखती है सहानुभूति। इस तरह आप कुछ छोटे सामान्य कारक के संबंध में बाल्टी के मापांक को निर्धारित करने के लिए अकेले "अंतिम" घटक पर भरोसा नहीं कर रहे हैं। जहां तक मुझे पता है कि उन्हें यह हासिल करने के लिए प्राइम होने की जरूरत नहीं है, बस कोप्राइम।
लेकिन अगर हैश फ़ंक्शन और हैशटेबल स्वतंत्र रूप से लिखे गए हैं, तो हैशटेबल को यह नहीं पता है कि हैश फ़ंक्शन कैसे काम करता है। यह छोटे कारकों के साथ एक निरंतर उपयोग हो सकता है। यदि आप भाग्यशाली हैं तो यह पूरी तरह से अलग तरह से काम कर सकता है और अशुभ हो सकता है। यदि हैश पर्याप्त अच्छा है, तो किसी भी बाल्टी की गिनती ठीक है। लेकिन एक पागल हैशटेब एक अच्छा हैश फ़ंक्शन ग्रहण नहीं कर सकता है, इसलिए बाल्टी की एक प्रमुख संख्या का उपयोग करना चाहिए। इसी तरह एक पैरानॉयड हैश फ़ंक्शन को एक लार्जिश प्राइम निरंतर का उपयोग करना चाहिए, इस संभावना को कम करने के लिए कि कोई भी एक बाल्टी का उपयोग करता है जो कि निरंतर के साथ एक सामान्य कारक होता है।
व्यवहार में, मुझे लगता है कि बाल्टी की संख्या के रूप में 2 की शक्ति का उपयोग करना काफी सामान्य है। यह सुविधाजनक है और सही परिमाण की एक प्रमुख संख्या के आसपास खोज करने या पूर्व-चयन करने से बचाता है। तो आप हैश फंक्शन पर भी मल्टीप्लायरों का उपयोग नहीं करने का भरोसा करते हैं, जो आमतौर पर एक सुरक्षित धारणा है। लेकिन आप अभी भी सामयिक बुरे हैशिंग व्यवहारों को ऊपर दिए गए हैश कार्यों के आधार पर प्राप्त कर सकते हैं, और प्राइम बकेट काउंट आगे मदद कर सकते हैं।
इस सिद्धांत के बारे में कहना कि "सब कुछ प्रधान होना है" जहां तक मैं जानता हूं कि एक पर्याप्त है, लेकिन शत्रुओं पर अच्छे वितरण के लिए एक आवश्यक शर्त नहीं है। यह सभी को यह मानने की आवश्यकता के बिना हस्तक्षेप करने की अनुमति देता है कि दूसरों ने एक ही नियम का पालन किया है।
[संपादित करें: एक बड़ी संख्या में बाल्टी का उपयोग करने का एक और विशेष कारण है, जो कि यदि आप रैखिक जांच के साथ टकराव को संभालते हैं। फिर आप हैशकोड से एक स्ट्राइड की गणना करते हैं, और यदि वह स्ट्राइड बकेट काउंट का एक कारक बन जाता है तो आप केवल उसी समय (बकेट_काउंट / स्ट्राइड) जांच कर सकते हैं जब आप शुरू कर चुके हैं। जिस मामले से आप सबसे बचना चाहते हैं, वह है = 0, निश्चित रूप से, जो विशेष आवरण वाला होना चाहिए, लेकिन विशेष आवरण वाली बाल्टी से बचने के लिए / एक छोटे पूर्णांक के बराबर स्ट्राइड, आप सिर्फ बाल्टी को बना सकते हैं। स्ट्राइड प्रदान किया जाता है यह 0. नहीं है।]