यह सवाल इस बात के बारे में नहीं है कि क्यों कोई गुणा करता है, यह काफी स्पष्ट है - वितरण के बारे में।हैशकोड गणना क्यों अतिप्रवाह बिट्स गुणा और अनदेखा करें?
Why use a prime number in hashCode?
बल्कि इस गुणा के अधिक के बारे में एक संपत्ति है कि अधिक महत्वपूर्ण और अधिक कारकों एक hashCode गणना सूत्र में शामिल किए गए हैं हो जाता है।
एक साधारण गणना स्पष्ट रूप से बहती है लेकिन यह बहुत कम महत्व है।
a * 31 + b
असली समस्या तब प्रदर्शित होती है जब कई आइटम सूत्र में होते हैं।
((a * 31) + b) * 31 ... 6n.
एक बार से अधिक 5 या 6 शब्द हैं, पहले सत्र के मूल्य के रूप में अपनी बिट्स समय hashCode मूल्य 5 + अवधि सहित पर निर्भर है द्वारा अतिप्रवाह है खो दिया है शामिल हैं। इस प्रणाली का उपयोग केवल अंतिम 5 या तो शब्द अंतिम मूल्य के लिए वास्तव में महत्वपूर्ण योगदानकर्ता हैं।
31^7 > Integer.MAX_VALUE
तो क्यों न सबसे गणना बिट्स कि वापस w/परिणाम के निचले बिट्स के आसपास है और XOR अतिप्रवाह रोल। मुझे इसकी सराहना है कि इसके लिए थोड़ा सा झुकाव और गणना लंबी अवधि (64 बिट्स) का उपयोग करके की जानी चाहिए ताकि शीर्ष 32 बिट्स को पूर्णांक परिणाम के साथ XOR'd किया जा सके लेकिन कम से कम कोई बिट खो जाएगा।
क्या कोई विशेष कारण है कि अतिप्रवाह को नजरअंदाज क्यों किया जाता है? जैसा कि पहले वर्णित एक लंबे समय तक उपयोग करने के लिए महंगा नहीं है।
संपादित
100000*31^7= 2751261411100000 0x9C641F717C560
6553600000*31^7 180306667837849600000 0xC641F717C5600000
ध्यान दें कि बाद के मूल्य जो भी मतलब है कि अपने जवाब 16 बिट बड़ा है पिछले की तुलना में वास्तव में 65536 गुना बड़ा है। ध्यान दें कि 0xC641F717C5600000 का पूर्णांक मान 0xC5600000 है जो वास्तविक बिट मान 16 बिट मान से खो जाता है।
*SAMPLE A*
65536*4096*27512614111
=7385361114638319616
=0x667E12CDF0000000
12345678
=0xF0000000
*SAMPLE B*
9*65536*4096*27512614111
=66468250031744876544
=0x9A6EA93D70000000
12345678
=0x70000000
सूचना है कि नमूना बी के शीर्ष सबसे बिट जो वास्तव में 9x नमूना एक है अंतिम 32 बिट मूल्य में लगभग पूर्ण कोई फर्क नहीं पड़ता - अगर मैं 17x को 9x बदल तो निम्न बिट्स होगा समान। हालांकि यदि शीर्ष 32 बिट्स के साथ अतिप्रवाह और xord के कारण शीर्षतम बिट्स "खो गए" नहीं थे तो मान अलग होगा।
इतना ही नहीं, लेकिन एक ही समस्या में एक लंबा सफर तय होगा, बस थोड़ा 'लंबा' ले जाएगा। (क्षमा करें, यह एक बुरा था ...) – corsiKa
गुणात्मक कारक के रूप में प्रमुख संख्याओं का पूरा कारण यह है कि बाधाओं का मतलब है कि मूल्य बाईं ओर स्थानांतरित हो जाते हैं और अंत में सभी बिट्स खो जाते हैं। हालांकि प्राइम्स में अभी भी वही समस्या है, वे थोड़ी बेहतर हैं और बिट्स गायब होने के लिए अधिक समय लेते हैं। –