2011-11-06 12 views
15

संभव डुप्लिकेट:
How do I create a HashCode in .net (c#) for a string that is safe to store in a database?क्या .NET स्ट्रिंग हैश फ़ंक्शन पोर्टेबल है?

मैं का उपयोग सी # 4.0 और लागू द्वारा स्ट्रिंग हैश हो जाता है:

"my string".GetHashCode() 

इस कॉल के द्वारा उत्पन्न कोड भविष्य के लिए डेटाबेस में संग्रहीत किया जाता है उपयोग। इस हैश कोड का उपयोग तारों के कुछ सबसेट और फिर बराबर तुलना करने के लिए किया जाता है।

प्रश्न हैं:

  1. यह एक मानकीकृत हैश गणना है? क्या मुझे लगता है कि यह है जो विभिन्न वातावरणों में समान हैश की गणना करने के लिए संभव है जैसे सी # .Net 3.0 या भविष्य में .Net संस्करण?
  2. क्या जावा, पीएल/एसक्यूएल, रूबी इत्यादि में इसे लिखकर अपने ही हैश फ़ंक्शन की गणना करना संभव है?
  3. क्या मुझे लगता है कि आज उत्पन्न हुआ हैश उसी यूआरएल में समान वातावरण होगा? उदाहरण के लिए जब मैं अपने कंप्यूटर को बंद करता हूं और प्रोग्राम को फिर से चलाता हूं, या लोकेल या कुछ अन्य सेटिंग्स बदलता है?
  4. पोर्टेबिलिटी की सीमाएं क्या हैं?
  5. मुझे पता है कि मैं इसे स्वयं कर सकता हूं, लेकिन हो सकता है कि किसी प्रकार की पोर्टेबिलिटी प्रदान की जा सके?
+13

आपके प्रश्नों के उत्तर नहीं हैं, नहीं, नहीं, नहीं, नहीं, कोई भी "पोर्टेबिलिटी" नहीं है, और कोई भी "पोर्टेबिलिटी" नहीं है। ** बिल्कुल आप किसी भी परिस्थिति में नहीं कर रहे हैं जो आप वर्णन कर रहे हैं। ** –

उत्तर

18

MSDN से:

GetHashCode विधि के डिफ़ॉल्ट कार्यान्वयन विभिन्न वस्तुओं के लिए अद्वितीय वापसी मान गारंटी नहीं है। इसके अलावा, .NET Framework GetHashCode विधि के डिफ़ॉल्ट कार्यान्वयन की गारंटी नहीं देता है, और यह मान जो मान देता है वह .NET Framework के विभिन्न संस्करणों के बीच समान होगा। नतीजतन, इस विधि के डिफ़ॉल्ट कार्यान्वयन को हैशिंग उद्देश्यों के लिए एक अद्वितीय ऑब्जेक्ट पहचानकर्ता के रूप में उपयोग नहीं किया जाना चाहिए।

तो नहीं, आप यह नहीं मान सकते कि GetHashCode द्वारा उत्पादित मूल्य स्थिर है। यह सिर्फ सैद्धांतिक नहीं है, या तो - we've seen the value change in the past

यदि आप एक स्थिर हैश चाहते हैं, तो आपको इसे स्वयं उत्पन्न करना होगा।

+0

"डिफ़ॉल्ट कार्यान्वयन" - क्या 'स्ट्रिंग' डिफ़ॉल्ट कार्यान्वयन का उपयोग करता है? मैं ईमानदारी से नहीं जानता, मैं बस इसकी उम्मीद नहीं करता (क्योंकि उनके पास हैश टेबल में मूल्य से इलाज किया जाता है)। – delnan

+3

'System.String'' GetHashCode' को ओवरराइड करता है, और इसमें [इसके दस्तावेज़] (http://msdn.microsoft.com/en-us/library/system.string.gethashcode.aspx) में एक समान नोट शामिल है: * व्यवहार GetHashCode के कार्यान्वयन पर निर्भर है, जो सामान्य भाषा रनटाइम के एक संस्करण से दूसरे में बदल सकता है। GetHashCode के प्रदर्शन में सुधार करने का एक कारण यह हो सकता है। *, और * GetHashCode द्वारा लौटाया गया मान प्लेटफॉर्म-निर्भर है। यह .NET Framework के 32-बिट और 64-बिट संस्करणों पर भिन्न है। * –

2

नहीं। यह पोर्टेबल नहीं है। आपको कभी हैश पेड़ को संतुलित करने के अलावा किसी अन्य चीज़ के लिए इस विधि का उपयोग करना चाहिए। यह फ्रेमवर्क के संस्करणों के बीच कार्यान्वयन बदल गया है, और 32-बिट/64-बिट सीएलआर के लिए अलग-अलग व्यवहार करता है।

एरिक लिपर्ट के पास इस कार्य के लिए नियमों और उचित उपयोगों पर blog post है।

इसके बजाय, आपको डेटाबेस में हैश डालने के लिए SHA1Managed का उपयोग करना चाहिए।

3

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

।नेट फ्रेमवर्क गेटहाशकोड विधि के डिफ़ॉल्ट कार्यान्वयन की गारंटी नहीं देता है, और यह मान जो मान देता है वह .NET Framework के विभिन्न संस्करणों के बीच होगा। नतीजतन, इस विधि के डिफ़ॉल्ट कार्यान्वयन को हैशिंग उद्देश्यों के लिए अद्वितीय ऑब्जेक्ट पहचानकर्ता के रूप में उपयोग नहीं किया जाना चाहिए।

संबंधित मुद्दे