2013-02-20 99 views
5

मैं इस दिलचस्प विषय (आईएमओ) के बारे में बहुत कुछ पढ़ रहा हूं। लेकिन मैं पूरी तरह से एक बात समझ में नहीं आ रही है:शब्दकोश <,> आकार, GetHashCode और प्राइम नंबर?

शब्दकोश आकार अभाज्य संख्या की क्षमता (निकटतम अभाज्य संख्या को डबल्स) बढ़ती जा रही है (जब पुनः आबंटन): है क्योंकि:

int index = hashCode % [Dictionary Capacity]; 
  • तो हम देख सकते हैं कि प्राइम संख्या [Dictionary Capacity] के लिए यहां उपयोग की जाती है क्योंकि उनके ग्रेटेस्ट कॉमोनफ़ैक्टर1 है। और यह टकराव से बचने के लिए में सहायता करता है।

इसके अलावा

मैं लागू करने के कई नमूने GetHashCode() देखा है:

public override int GetHashCode() 
{ 
    unchecked 
    { 
     int hash = 17; 
     // Suitable nullity checks etc, of course :) 
     hash = hash * 23 + field1.GetHashCode(); 
     hash = hash * 23 + field2.GetHashCode(); 
     hash = hash * 23 + field3.GetHashCode(); 
     return hash; 
    } 
} 

मुझे समझ नहीं आता:

यहाँ जॉन स्कीट से एक नमूना है:

क्वेस्टी getHashCode की पीढ़ी में Dictionary capacity और:

पर रूढ़ अंक में दोनों उपयोग किया जाता है करता है?

उपरोक्त कोड में, वहाँ एक अच्छा मौका है कि वापसी मान नहीं अभाज्य संख्या हो जाएगा क्योंकि [कृपया मुझे सही कर अगर मैं गलत हूँ]

  • की वजह से गुणा द्वारा 23
  • प्रत्येक क्षेत्र के लिए GetHashCode() मूल्य के अतिरिक्त।

उदाहरण के लिए: (11,17,173 अभाज्य संख्या हैं)

 int hash = 17; 
     hash = hash * 23 + 11; //402 
     hash = hash * 23 + 17; //9263 
     hash = hash * 23 + 173 //213222 
     return hash; 

213222 एक प्रमुख नहीं है।

इसके अलावा किसी भी गणित नियम नहीं है जो राज्य:

(not a prime number) + (prime number) = (prime number)

है और न ही

(not a prime number) * (prime number) = (prime number)

है और न ही

(not a prime number) * (not a prime number) = (prime number)

तो क्या मुझे याद आ रही है?

+0

आपने यह GetHashCode कार्यान्वयन कहाँ देखा? – Tigran

+0

@ टिग्रान http://stackoverflow.com/a/263416/859154 –

+1

मैंने कभी भी कहीं भी नहीं पढ़ा है कि हैश कोड प्राइम होना चाहिए, या यहां तक ​​कि अगर यह प्रमुख है तो यह बेहतर होगा - उन्हें क्या होना चाहिए जितना संभव हो उतना समान रूप से वितरित किया जाना चाहिए उनकी पूरी रेंज। – MiMo

उत्तर

7

इससे कोई फर्क नहीं पड़ता कि GetHashCode का परिणाम क्या है (यह बिल्कुल प्राइम नहीं होना चाहिए), जब तक परिणाम दो वस्तुओं के समान होता है जिन्हें बराबर माना जाता है। हालांकि, यह अच्छा (लेकिन आवश्यक नहीं) GetHashCode दो वस्तुओं के लिए एक अलग मूल्य लौटाता है जो अलग-अलग माना जाता है (लेकिन अभी भी आवश्यक नहीं है)।

को देखते हुए दो नंबर एक और , जब आप उन्हें आप c = a * b मिल गुणा। आमतौर पर और बी के कई अलग-अलग जोड़े होते हैं जो एक ही परिणाम c देते हैं। उदाहरण के लिए 6 * 2 = 12 और 4 * 3 = 12. हालांकि, एक प्राइम नंबर है, वही परिणाम देने वाले बहुत कम जोड़े हैं। यह संपत्ति के लिए सुविधाजनक है कि विभिन्न ऑब्जेक्ट्स के लिए हैश कोड अलग होना चाहिए।

शब्दकोश में एक ही सिद्धांत लागू होता है: वस्तुओं को उनके हैश के आधार पर बाल्टी में रखा जाता है। चूंकि अधिकांश पूर्णांक एक प्रमुख संख्या से अच्छी तरह से विभाजित नहीं होते हैं, इसलिए आपको बाल्टी में अपनी वस्तुओं का अच्छा प्रसार मिलता है। आदर्श रूप से आप इष्टतम शब्दकोश प्रदर्शन के लिए प्रत्येक बाल्टी में केवल एक आइटम चाहते हैं।


थोड़ा विषय से हटकर: सिकाडा के (है कि एक कीट है) use prime numbers कितने साल वे जाने के लिए और फिर संभोग के बाद निर्धारित करने के लिए। चूंकि यह संभोग चक्र प्राइम वर्षों की संख्या है, इसलिए अपने किसी भी दुश्मन के जीवन चक्र के साथ मिलकर संभोग की संभावनाएं पतली हैं।

+3

+1, उत्कृष्ट स्पष्टीकरण। –

+0

@Virtlink: + 1 बिट मुझे cicadas पर, उसे नहीं पता था। बिल्कुल विषय से बाहर, लेकिन असाधारण सुंदर। पहले ही जी + पर पोस्ट किया गया है। – Tigran

+0

@ टिग्रान अधिक दिलचस्प- हम कैसे (इंसान) इस निष्कर्ष पर पहुंचे ... –