पर मैं जोशुआ ब्लोच के प्रभावी जावा के Chapter 3 के माध्यम से पढ़ रहा हूं। मद 8 में:पूर्णांक गुणा, अतिप्रवाह, और सूचना हानि
result = 37 * result + c;
इसके बाद वे बताती हैं कि क्यों 37 में चुना गया था (जोर जोड़ा):
हमेशा जब आप ओवरराइड hashCode ओवरराइड के बराबर होती है, लेखक अपने हैशिंग समारोह में निम्नलिखित संयोजन कदम का उपयोग करता हैगुणक 37 चुना गया था क्योंकि यह एक विषम प्रधान है। यदि यह भी था और गुणा बहती है, तो जानकारी खो जाएगी क्योंकि गुणा दो से स्थानांतरित करने के बराबर है। एक प्राइम नंबर का उपयोग करने के फायदे कम स्पष्ट हैं, लेकिन इस उद्देश्य के लिए प्राइम का उपयोग करना पारंपरिक है।
मेरा प्रश्न क्यों यह फर्क पड़ता है कि संयोजन कारक (37) अजीब है? क्या कारक अजीब था या नहीं, इस पर ध्यान दिए बिना सूचना के नुकसान में ओवरफ्लो परिणाम गुणा नहीं करेगा?
आह, तो यह केवल थोड़ी सी सूचना हानि नहीं है जिसे आप ओवरफ्लो से प्राप्त कर सकते हैं, जिसके बारे में हम चिंतित हैं, यह * पूर्ण * जानकारी का नुकसान है जिसे आप परिणाम से शून्य करने से प्राप्त कर सकते हैं? –
@ बिलथ्लिज़र: वास्तव में, यह एक-दूसरे को अनुकरण करने वाले एकाधिक गुणों से डेटा है। उपर्युक्त एल्गोरिदम 'परिणाम = 2 * (2 * ए + बी) + सी' का उपयोग करके तीन गुणों ए, बी, और सी मानते हुए, आप देख सकते हैं कि' ए, बी, सी' के कई सामान्य सेटों में डुप्लीकेट होगा। यदि आप लगातार एक विषम प्राइम का उपयोग करते हैं, तो उसी हैश मानों के साथ सेट होने की संभावना बहुत कम हो जाती है। –
समस्या पूरी तरह से शून्य करने से पहले समस्या प्रकट होती है। एक बार दो गुणक द्वारा 8-बिट हैश गुणा करने पर विचार करें - यह 256 संभावित मानों से शुरू हुआ, और 128 संभावित मानों के साथ समाप्त होता है। –