hashCode()
क्लास बुलियन की विधि इस तरह से लागू की गई है:
public int hashCode() {
return value ? 1231 : 1237;
}
यह 1231 और 1237 का उपयोग क्यों करता है? कुछ और क्यों नहीं?
hashCode()
क्लास बुलियन की विधि इस तरह से लागू की गई है:
public int hashCode() {
return value ? 1231 : 1237;
}
यह 1231 और 1237 का उपयोग क्यों करता है? कुछ और क्यों नहीं?
जवाबों:
1231 और 1237 केवल दो (पर्याप्त रूप से बड़े) मनमाने ढंग से अभाज्य संख्याएँ हैं । कोई अन्य दो बड़ी प्राइम संख्याएँ ठीक करेंगी।
क्यों होता है प्राइम?
एक दूसरे के लिए मान लीजिए कि हमने मिश्रित संख्या (गैर-primes) को चुना, 1000 और 2000 का कहना है। बूलियन को एक हैश टेबल में डालने पर, सही और गलत बाल्टी के 1000 % N
रिस्पांस 2000 % N
(जहां बाल्टी N
की संख्या होती है) में चले जाएंगे ।
अब ध्यान दें कि
1000 % 8
के रूप में एक ही बाल्टी 2000 % 8
1000 % 10
के रूप में एक ही बाल्टी 2000 % 10
1000 % 20
के रूप में एक ही बाल्टी 2000 % 20
दूसरे शब्दों में, यह कई टकरावों को जन्म देगा ।
ऐसा इसलिए है क्योंकि १००० (२ ३ , ५ ३ ) और २००० (२ ४ , ५ ३ ) का कारकत्व है ) के कारक में इतने सामान्य कारक हैं। इस प्रकार अभाज्य संख्याएँ चुनी जाती हैं, क्योंकि बाल्टी के आकार के साथ उनके कोई सामान्य कारक होने की संभावना नहीं है।
बड़े अपराध क्यों । 2 और 3 नहीं होगा?
कंपोजिट ऑब्जेक्ट के लिए हैश कोड की गणना करते समय घटकों के लिए हैश कोड जोड़ना आम है। यदि बड़ी संख्या में बाल्टियों के साथ हैश सेट में बहुत छोटे मानों का उपयोग किया जाता है, तो वस्तुओं के असमान वितरण के साथ समाप्त होने का जोखिम होता है।
क्या टकराव मायने रखता है? वैसे भी बूलियन के दो अलग-अलग मूल्य हैं?
नक्शे में अन्य वस्तुओं के साथ एक साथ बूलियन हो सकते हैं। साथ ही, जैसा कि Drunix द्वारा बताया गया है, समग्र वस्तुओं के हैश कार्यों को बनाने का एक सामान्य तरीका है सबमर्सिबल हैश कोड के कार्यान्वयन का पुन: उपयोग करना जिसमें बड़े अपराधों को वापस करना अच्छा होता है।
संबंधित सवाल:
2*1231 = 2462
बाल्टी की आवश्यकता होगी । क्या ऐसी स्थिति में टकराव एक समस्या है?