मैं हैश कुंजी को यादृच्छिक बनाने के लिए जावा के दृष्टिकोण के बारे में पढ़ रहा था here
जाहिर है यह विचार यह सुनिश्चित करना है कि निचले बिट्स वितरण में मदद करने के लिए "यादृच्छिक" हैं लेकिन मैं इसे और समझने की कोशिश कर रहा हूं।
तो यदि हमारे पास आकार 10 की एक तालिका है तो संख्या 0,10,20,30,40 आदि सभी बाल्टी 0 में आती हैं, संख्या 1,11,21,31 आदि बाल्टी 1 आदि में गिरती हैं (मॉड्यूलो 10 का उपयोग करके) ।
तो बिट पैटर्न को बदलने से आप इन्हें बाल्टी 0 पर जाने के बजाए अलग-अलग बाल्टी में जा सकते हैं।
लेकिन मुझे इस बारे में स्पष्ट नहीं है कि यह कितना संपत्ति है जिससे कम ऑर्डर बिट प्रभावित होते हैं और हमें यादृच्छिक बनाना होगा उन्हें। तो हमने:बिट पैटर्न की कौन सी संपत्ति टकराव का कारण बनती है?
0000 0000 (0)
0000 1010 (10)
0001 0100 (20)
0001 1110 (30)
0010 1000 (40)
कम आदेश बिट है कि उन्हें बनाता में नियमितता ही स्लॉट के लिए रखा क्या है?
शायद मैं निम्नलिखित पर उलझन में हूं? मेरी समझ यह है कि यह कम ऑर्डर बिट्स में कुछ नियमितता है जो टकराव का कारण बनती है और हम
मैं इस पर स्पष्ट नहीं कर रहा हूँ:: यहाँ OpenJDK के HashMap कार्यान्वयन से एक अंश है 'हैश कार्यान्वयन के लिए ..लेकिन बकेट की संख्या हमेशा 2 की एक शक्ति है, तथ्य यह है कि सभी हैश 8 से विभाज्य हो रहा है जहां इसका मतलब होगा कि ज्यादातर बाल्टी खाली थीं। '8 क्या है? पते का आकार? और यह 2 की शक्ति के आकार के लिए क्यों होता है? क्या आप इस पर थोड़ा सा विस्तार कर सकते हैं? – Jim
@Jim: 8 सामान्य हार्डवेयर संरेखण का एक उदाहरण है: लगभग सभी वस्तुओं में 8 से विभाजित पते होते हैं, क्योंकि सीपीयू एक ही पहुंच में आठ गठबंधन बाइट्स पढ़ सकता है (जबकि यदि वस्तु सीमा पर विभाजित होती है, तो यह ले जाएगा दो मेमोरी एक्सेस)। और यदि आप आठ मॉड्यूलो द्वारा 2 की कुछ शक्तियों को विभाजित करते हैं, तो आप आठ से विभाजित मूल्य के साथ समाप्त होते हैं, इसलिए प्रत्येक आठ बाल्टी में से सात का उपयोग नहीं किया जाएगा। – rici