Boolean.hashCode ()


122

hashCode()क्लास बुलियन की विधि इस तरह से लागू की गई है:

public int hashCode() {
    return value ? 1231 : 1237;
}

यह 1231 और 1237 का उपयोग क्यों करता है? कुछ और क्यों नहीं?


1
ये दो संख्याएँ पर्याप्त रूप से बड़ी संख्याएँ हैं। अधिक जानकारी के लिए कृपया विकिपीडिया पर हैश टेबल पर लेख पढ़ें ।
बोरिस पावलोविक्स

जवाबों:


140

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 द्वारा बताया गया है, समग्र वस्तुओं के हैश कार्यों को बनाने का एक सामान्य तरीका है सबमर्सिबल हैश कोड के कार्यान्वयन का पुन: उपयोग करना जिसमें बड़े अपराधों को वापस करना अच्छा होता है।

संबंधित सवाल:


1
मुझे लगता है कि ये पर्याप्त रूप से बड़े हैं। 1 से अधिक gcd पाने के लिए, आपको कम से कम 2*1231 = 2462बाल्टी की आवश्यकता होगी । क्या ऐसी स्थिति में टकराव एक समस्या है?
एयरोबे

2
दिलचस्प है कि वे वास्तव में "काफी बड़े" नहीं हैं, यह विचार करते हुए कि एक इंट में क्या फिट हो सकता है। मुझे लगता है कि वे JDK हैशटेबल के साथ अच्छी तरह से काम करने के लिए अभी काफी बड़े हैं, लेकिन गणना लागत को कम करने के लिए अभी भी काफी छोटा है।
थिलो

2
हाँ, यह मुझे भी मारा है कि वे नहीं कर रहे हैं कि बड़े। लेकिन क्या आप मानते हैं कि बड़े अपराधों के साथ अधिक लागत है?
.ोबियो

3
@ थिलो को टकराने से पहले आपको 1231 * 1237 = 1,522,747 बाल्टी की आवश्यकता होगी, यह काफी बड़ा है
शाफ़्ट फ्रीक

2
मैं कहूंगा कि बाल्टी की गिनती के साथ टकराव के कारण वास्तव में बूलियन के साथ कोई समस्या नहीं है, लेकिन अधिक सामान्य निर्माण कैसे हम एक समग्र वस्तु के हैकोड को प्राप्त करते हैं, अर्थात् घटकों के हैशकोड को कुछ स्थिरांक के साथ गुणा करके और उन्हें जोड़कर।
Drunix

2

उपरोक्त सभी के अलावा, यह डेवलपर्स से एक छोटा ईगस्टर अंडा भी हो सकता है:

सच: १२३१ => १ + २ + ३ + १ =>

7 - यूरोपीय परंपराओं में एक भाग्यशाली संख्या है;

गलत: 1237 => 1 + 2 + 3 + 7 = 13

13 (उर्फ डेविल के दर्जन) - अशुभ संख्या।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.