ReSharper GetHashCode ओवरराइड के लिए '397' का उपयोग क्यों किया जाता है?


150

आप में से कई की तरह, मैं विकास प्रक्रिया को गति देने के लिए ReSharper का उपयोग करता हूं। जब आप इसका उपयोग किसी वर्ग के समानता सदस्यों को ओवरराइड करने के लिए करते हैं, तो GetHashCode () के लिए उत्पन्न कोड-जीन इस प्रकार दिखता है:

    public override int GetHashCode()
    {
        unchecked
        {
            int result = (Key != null ? Key.GetHashCode() : 0);
            result = (result * 397) ^ (EditableProperty != null ? EditableProperty.GetHashCode() : 0);
            result = (result * 397) ^ ObjectId;
            return result;
        }
    }

बेशक, मेरे कुछ सदस्य वहां हैं, लेकिन मैं जानना चाहता हूं कि 397 क्यों है?

  • संपादित करें: इसलिए मेरा प्रश्न बेहतर होगा, क्योंकि क्या 397 अभाज्य संख्याओं में से कोई एक 'विशेष' है जो एक अभाज्य संख्या है?

जवाबों:


166

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


73
और 397 खुश है। क्या हम सब सिर्फ खुश रहना चाहते हैं?
रसेल बी

2
ठीक है, लेकिन इसे क्यों प्रधान होना है, और इसे उस सटीक परिमाण का क्यों होना है? अगर यह प्रधान होना है, तो 2 या 2147483647 क्यों नहीं? मुझे लगता है कि अच्छा म्यूटेशन (और इस गुणन का केवल एक ही कारण है म्यूटेशन) हमें प्राइम होने के लिए नंबर की आवश्यकता नहीं है। हमें गुणक की आवश्यकता है अपेक्षाकृत समान संख्या या शून्य और वाले, अधिमानतः स्पष्ट पैटर्न के बिना। 397 = 110001101 बी अनुपालन करता है। अभी भी परिमाण के बारे में निश्चित नहीं है।
एंड्री के

5
जैसा कि निक ने कहा, इसके बारे में कुछ खास नहीं है। यह उस आकार के होने की आवश्यकता नहीं है, यह सिर्फ एक संख्या है जो इतनी बड़ी है कि जब आप एक हैश की गणना कर रहे हैं तो परिणाम अतिप्रवाह होगा (चूंकि GetHashCode () एक Int32 देता है)। प्राइम का चयन करना वितरण के लिए सिर्फ सहायक होता है, मेरे पास गणित की डिग्री नहीं है इसलिए मैं इसे समझने और समझाने की कोशिश नहीं कर रहा हूं, लेकिन प्राइम द्वारा गुणा करने का एक परिणाम होगा कि किसी भी अन्य मनमानी संख्या से गुणा से अधिक वितरित किया जाए।
बेन रान्डेल

16

हैश का उपयोग करने वाला हैश FNV हैश के एक संस्करण की तरह दिखता है । एफएनवी को अक्सर विभिन्न अपराधों के साथ लागू किया जाता है। यहाँ FNV के लिए primes के उपयुक्त विकल्प पर चर्चा है

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