दिलचस्प पोस्ट
जावा: sun.security.provider.certpath.SunCertPathBuilderException: अनुरोधित लक्ष्य के लिए वैध प्रमाणीकरण पथ खोजने में असमर्थ ओवरराइडिंग बनाम छुपा जावा – उलझन में स्प्रिंग वेबसकेट @ सेंडटोसेशन: विशिष्ट सत्र को संदेश भेजें Cassandra cqlsh – टाइमस्टैम्प कॉलम के लिए माइक्रोसेकंड / मिलीसेकेंड दिखाने के लिए कैसे? नई गतिविधि शुरू करते समय गतिविधि स्लाइड-इन एनीमेशन अक्षम करें? सूची में विशिष्ट मूल्यों की एक सूची प्राप्त करें नकली वस्तुओं का उद्देश्य क्या है? मैं HTML संस्थाओं को तेजी से कैसे डीकोड कर सकता हूं? क्या एक स्ट्रैट अस्थिर बनाते हुए उसके सभी सदस्यों को अस्थिर बनाते हैं? इन-ऐप खरीद "सबमिट करने के लिए तैयार", लेकिन मुझे इसे सबमिट नहीं करने देंगे स्विफ्ट से ऑब्जेक्टिव-सी कोड को कैसे कॉल करें संख्या का वर्ग #define का उपयोग करके परिभाषित किया जा रहा है स्ट्रिंगबिल्डर और स्ट्रिंगबफर के बीच का अंतर SQLite डेटाबेस में अर्रे सूची सहेज रहा है आईएएस पर आईएसएएस अंतरालीय विज्ञापन

__hash __ () को कार्यान्वित करने का सही और अच्छा तरीका क्या है?

__hash__() को कार्यान्वित करने का सही और अच्छा तरीका क्या है?

मैं फ़ंक्शन के बारे में बात कर रहा हूं जो एक हैशोड देता है जो तब वस्तुओं को हैशटबल में अनुवाद करने के लिए उपयोग किया जाता है।

के रूप में __hash__() एक पूर्णांक देता है और "binning" ऑब्जेक्ट के लिए __hash__() में उपयोग किया जाता है, मैं मानता हूं कि लौटा पूर्णांक के मानों को आम डेटा के लिए समान रूप से वितरित किया जाना चाहिए (टकराव को कम करने के लिए)। ऐसे मूल्यों को पाने के लिए एक अच्छा अभ्यास क्या है? क्या टकराव एक समस्या है? मेरे मामले में मेरे पास एक छोटा वर्ग है जो एक कंटेनर वर्ग के रूप में कार्य करता है जिसमें कुछ ints, कुछ फ़्लोट्स और स्ट्रिंग होते हैं।

Solutions Collecting From Web of "__hash __ () को कार्यान्वित करने का सही और अच्छा तरीका क्या है?"

__hash__() को कार्यान्वित करने का एक आसान, सही तरीका कुंजी टपल का उपयोग करना है यह एक विशेष हैश के रूप में तेजी से नहीं होगा, लेकिन यदि आपको इसकी आवश्यकता है तो आपको सी में टाइप को लागू करना चाहिए।

हैश और समानता के लिए कुंजी का उपयोग करने का एक उदाहरण यहां दिया गया है:

 class A(object): def __key(self): return (self.attr_a, self.attr_b, self.attr_c) def __eq__(x, y): return x.__key() == y.__key() def __hash__(self): return hash(self.__key()) 

इसके अलावा, __hash__ के दस्तावेज़ीकरण में अधिक जानकारी है, जो कि कुछ विशेष परिस्थितियों में मूल्यवान हो सकती है।

माइक्रोसॉफ्ट रिसर्च के पॉल लार्सन ने हैश फ़ंक्शन की एक विस्तृत विविधता का अध्ययन किया। उसने मुझे बोला की

 for c in some_string: hash = 101 * hash + ord(c) 

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

जॉन मिलिकिन ने इस तरह के समाधान का प्रस्ताव:

 class A(object): def __init__(self, a, b, c): self._a = a self._b = b self._c = c def __eq__(self, othr): return ((self._a, self._b, self._c) == (othr._a, othr._b, othr._c)) def __hash__(self): return hash((self._a, self._b, self._c)) 

इस समाधान के साथ समस्या यह है कि hash(A(a, b, c)) == hash((a, b, c)) । दूसरे शब्दों में, हैश अपने प्रमुख सदस्यों के टपल के साथ टकराता है। शायद यह अभ्यास में अक्सर बात नहीं करता है?

__hash__ पर पायथन दस्तावेज़ीकरण उप-घटकों के हंस को गठबंधन करने का सुझाव देता है जैसे XOR जैसे कुछ, जो हमें यह देता है:

 class B(object): def __init__(self, a, b, c): self._a = a self._b = b self._c = c def __eq__(self, othr): return (isinstance(othr, type(self)) and (self._a, self._b, self._c) == (othr._a, othr._b, othr._c)) def __hash__(self): return (hash(self._a) ^ hash(self._b) ^ hash(self._c) ^ hash((self._a, self._b, self._c))) 

बोनस: अच्छा उपाय के लिए वहां अधिक मजबूत __eq__ फेंक दिया गया।

अद्यतन: जैसा कि ब्लैककिग्थ बताते हैं, ए, बी, और सी के क्रम को बदलने से समस्याएं हो सकती हैं। मैंने एक अतिरिक्त ^ hash((self._a, self._b, self._c)) मूल्यों के आदेश को पकड़ने के लिए धोया जा रहा है यह अंतिम ^ hash(...) को हटाया जा सकता है यदि मूल्यों को जोड़ना दोबारा नहीं किया जा सकता (उदाहरण के लिए, यदि उनके पास अलग-अलग प्रकार हैं और इसलिए _a का मान _b या _c को कभी भी असाइन नहीं किया जाएगा)।

मैं आपके प्रश्न के दूसरे भाग का जवाब देने की कोशिश कर सकता हूं।

टकराव संभवत: हैश कोड से न हो, लेकिन एक संग्रह में किसी भी सूचकांक में हैश कोड को मैप करने से। इसलिए उदाहरण के लिए, आपके हैश फ़ंक्शन 1 से 10000 तक यादृच्छिक मानों को वापस कर सकता है, लेकिन यदि आपके हैश तालिका में केवल 32 प्रविष्टियां हैं तो आप प्रविष्टि पर टकराव प्राप्त करेंगे।

इसके अलावा, मैं सोचता हूं कि आंतरिक संग्रह से टकराव को हल किया जाएगा, और टकरावों को हल करने के कई तरीके हैं। सरलतम (और सबसे खराब), इंडेक्स में सम्मिलित करने के लिए एक प्रविष्टि दी गई है, 1 से मैं जोड़कर जब तक आप खाली जगह नहीं मिलते हैं और वहां सम्मिलित करते हैं पुनर्प्राप्ति तो उसी तरह काम करता है इसके परिणामस्वरूप कुछ प्रविष्टियों के लिए अक्षम पुनर्प्राप्तियां मिलती हैं, क्योंकि आपके पास एक प्रविष्टि हो सकती है जिसके लिए पूरे संग्रह को ढूंढने की आवश्यकता होती है!

अन्य टक्कर के रिज़ॉल्यूशन के तरीकों में हैश तालिका में प्रविष्टियां बढ़कर पुनर्प्राप्ति का समय कम हो जाता है जब चीजें फैलाने के लिए कोई आइटम डाला जाता है। इससे सम्मिलन समय बढ़ जाता है लेकिन यह मानता है कि आप सम्मिलित होने से अधिक पढ़ें। ऐसे तरीकों भी हैं जो अलग टकराने वाली प्रविष्टियों को आज़माने और शाखाओं को बांटते हैं ताकि एक विशेष स्थान में क्लस्टर को प्रविष्ट किया जा सके।

इसके अलावा, अगर आपको संग्रह का आकार बदलने की ज़रूरत है तो आपको हर चीज को पुन: साझा करना होगा या डायनेमिक हैशिंग विधि का उपयोग करना होगा।

संक्षेप में, आप के लिए जो हैश कोड का उपयोग कर रहे हैं उसके आधार पर आपको अपनी टकराव रिज़ॉल्यूशन विधि लागू करनी पड़ सकती है। यदि आप उन्हें किसी संग्रह में संग्रहीत नहीं कर रहे हैं, तो संभवतः आप एक हैश फ़ंक्शन के साथ भाग ले सकते हैं जो सिर्फ एक बहुत बड़ी रेंज में हैश कोड जनरेट करता है। यदि हां, तो आप यह सुनिश्चित कर सकते हैं कि आपकी मेमोरी की चिंताओं के आधार पर आपका कंटेनर बड़ा होना चाहिए (ज़्यादा ज़्यादा बेहतर होगा)

यदि आप अधिक रुचि रखते हैं तो यहां कुछ लिंक दिए गए हैं:

विकिपीडिया पर सहृद्धित हैशिंग

विकिपीडिया में विभिन्न टक्कर रिज़ॉल्यूशन विधियों का सारांश भी है:

इसके अलावा, " फाइल ऑर्गेनाइजेशन एंड प्रोसेसिंग " थारप द्वारा टकराव रिज़ॉल्यूशन के तरीकों को बड़े पैमाने पर शामिल किया गया है। आईएमओ यह हैशिंग एल्गोरिदम के लिए एक महान संदर्भ है।

हैश मूल्य के आकार पर निर्भर करता है जो आप वापस आते हैं। यह आसान तर्क है कि अगर आपको 32 बिट INTS के 32 हिट एश के आधार पर 32 बिट एट लौटने की आवश्यकता है, तो आप टकराव प्राप्त कर सकते हैं।

मैं थोड़ा कामकाज के पक्ष में था जैसे, निम्न छ छद्म कोड:

 int a; int b; int c; int d; int hash = (a & 0xF000F000) | (b & 0x0F000F00) | (c & 0x00F000F0 | (d & 0x000F000F); 

इस तरह की व्यवस्था भी फ्लोट्स के लिए काम कर सकती है, यदि आप वास्तव में एक अस्थायी बिंदु मान का प्रतिनिधित्व करने के बजाय उन्हें थोड़ा सा मान लेते हैं, तो बेहतर होगा

स्ट्रिंग्स के लिए, मुझे थोड़ी जानकारी नहीं मिली है।