2016-12-16 8 views
7

बनाने का कोई तरीका है। .NET कोर में .NET के विपरीत, यह महसूस करने से पहले मैंने कुछ घंटों के डिबगिंग को बर्बाद कर दिया है, हर बार जब आप अपना कोड चलाते हैं तो GetHashCode एक अलग मूल्य देता है। मैं इसके लिए तर्क को पूरी तरह से समझता हूं। हैश कोड मानों पर निर्भर करना एक बहुत बुरा विचार है (जैसे उन्हें क्रमबद्ध करना)। मुझे यह भी याद है कि माइक्रोसॉफ्ट (कोर से पहले) में .NET के आंतरिक निर्माण प्रत्येक बिल्ड के लिए गेटहाशकोड के व्यवहार को बदल देंगे ताकि कोई भी इसके साथ बहुत सहज न हो।क्या .NET कोर GetHashCode निर्धारक

यह सब कहकर, मैं वर्तमान में जटिल कोड डीबग कर रहा हूं जो गेटहाशकोड का भारी उपयोग करता है। मुझे पता है कि बग मेरा अपना काम है और गेटहाशकोड के साथ कुछ लेना देना नहीं है, लेकिन हर बार जब मैं इसे चलाता हूं, तो यह कहीं और विफल रहता है। बहुत कष्टप्रद। क्या हैटहेशकोड को .NET (जबकि मैं डिबगिंग कर रहा हूं) में अपना खुद का हैश फ़ंक्शन लिखने के बिना और मेरे कोड में इसे हर जगह बदलने के लिए मजबूर करने का कोई तरीका है?

+1

क्या आपका मतलब है 'स्ट्रिंग। गेटहाशकोड()' या 'ऑब्जेक्ट। गेटहाशकोड() '? मुझे नहीं लगता कि आप बाद वाले को प्रभावित कर सकते हैं; यह हमेशा ऑब्जेक्ट संदर्भ पर आधारित होता है जो छद्म-निर्धारिती से अधिक नहीं होता है। पूर्व को संकलन समय पर 'FEATURE_RANDOMIZED_STRING_HASHING' द्वारा नियंत्रित किया जाता है और रनटाइम पर [''] (https://msdn.microsoft.com/library/jj152924) द्वारा नियंत्रित किया जाता है - लेकिन मुझे नहीं पता कि .NET कोर का सम्मान करता है उत्तरार्द्ध, बस यह निश्चित रूप से डिफ़ॉल्ट रूप से है। –

+0

स्पष्टीकरण के लिए, जब मैं "संकलन समय" कहता हूं, मेरा मतलब है * रनटाइम * को संकलित करने के समय, न कि अपने स्वयं के आवेदन। अपने कोड में 'FEATURE_RANDOMIZED_STRING_HASHING' को परिभाषित करना कुछ भी नहीं करता है। लेकिन .NET कोर ओपन सोर्स है, अगर आप इसकी बात करते हैं तो आप इसे हमेशा पुनर्निर्माण कर सकते हैं। –

+0

मेरा कोड जेनेरिक है, असल में यह ऑब्जेक्ट है। गेटहाशकोड() लेकिन मेरे उदाहरण में ऑब्जेक्ट एक स्ट्रिंग है इसलिए हैश कोड (अपरिवर्तनीय) स्ट्रिंग सामग्री पर आधारित है। –

उत्तर

0

व्यावहारिक समाधान मुझे स्ट्रिंग प्राप्त करने के लिए मिला है। कई निष्पादन में अनुमानित मानों को वापस करने के लिए गेटहाशकोड क्लासिक .NET (4.6) पर वापस स्विच करने के लिए है। चूंकि मेरे कोड के बारे में कुछ भी .NET कोर विशिष्ट नहीं है, इसलिए मुझे केवल एक ही काम करना था जो एक नई परियोजना थी। मैंने .NET 4.6 के तहत अपना कोड डीबग किया, बग तय किया और कोर पर वापस स्विच किया।

2

docs के अनुसार केवल ढांचे के परिवर्तन को हैश परिणाम बदलना चाहिए। मैं भी इस पर ठोकर खाई। मेरा समाधान मेरा अपना हैश एल्गोरिदम बनाना था। इसमें कुछ मिनट लग गए क्योंकि मुझे कुछ भी कल्पना की जरूरत नहीं थी।

private static int GetSimpleHash(string s) 
{ 
    return s.Select(a => (int)a).Sum(); 
} 

एक तरफ नोट पर मैंने डॉटनेट कोर 1.1 के लिए एक बग दायर किया है। (स्ट्रिंग) .GetHashCode() here

अद्यतन

हैश ढांचे या डोमेन के कारण बदल सकते हैं। इसका मतलब है कि एक ही कार्यक्रम के दो बाद के रन अलग-अलग परिणाम लौटा सकते हैं।
अलास मेरी बग रिपोर्ट म्यूट है और बदले में एक दस्तावेज़ अद्यतन में बदल गया है।