2010-04-08 12 views
32

.NET ढांचे में एमडी 5 हैश की गणना करने के कुछ तरीके हैं, ऐसा लगता है, हालांकि ऐसा कुछ है जिसे मैं समझ नहीं पा रहा हूं;MD5.Create और MD5CryptoServiceProvider का उपयोग करने के बीच क्या अंतर है?

निम्नलिखित के बीच अंतर क्या है? क्या उन्हें एक दूसरे से अलग करता है? वे समान परिणाम प्राप्त होने लगते हैं:

public static string GetMD5Hash(string str) 
    { 
     MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 
     byte[] bytes = ASCIIEncoding.Default.GetBytes(str); 
     byte[] encoded = md5.ComputeHash(bytes); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < encoded.Length; i++) 
      sb.Append(encoded[i].ToString("x2")); 

     return sb.ToString(); 
    } 

    public static string GetMD5Hash2(string str) 
    { 
     System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create(); 
     byte[] bytes = Encoding.Default.GetBytes(str); 
     byte[] encoded = md5.ComputeHash(bytes); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < encoded.Length; i++) 
      sb.Append(encoded[i].ToString("x2")); 

     return sb.ToString(); 
    } 

उत्तर

29

System.Security.Cryptography.MD5.Create() वास्तव में एक MD5CryptoServiceProvider पैदा कर रही है। यही कारण है कि आप एक ही परिणाम देखते हैं।

परिभाषा को देखते हुए एमडी 5 आधार वर्ग है और यह सार है। मुझे लगता है कि उन्होंने आसानी से उपयोग के लिए सार्वजनिक निर्माण समारोह जोड़ा।

public sealed class MD5CryptoServiceProvider : MD5 

public abstract class MD5 : HashAlgorithm 

परिभाषाओं पर एक नज़र डालें।

MD5 अमूर्त वर्ग का प्रतिनिधित्व करता है जिससे एमडी 5 हैश एल्गोरिदम के सभी कार्यान्वयन होते हैं।

MD5CryptoServiceProvider क्रिप्टोग्राफिक सेवा प्रदाता (सीएसपी) द्वारा प्रदान किए गए कार्यान्वयन का उपयोग करके इनपुट डेटा के लिए MD5 हैश मान की गणना करता है। इस वर्ग को विरासत नहीं बनाया जा सकता।

+2

पर परीक्षण किया गया है, जहां आप 'MD5.Create()' विधि को एक प्रकार की फैक्ट्री विधि के रूप में मानते हैं जो कि 'MD5CryptoServiceProvider' उदाहरण को फिर से शुरू कर सकता है लेकिन भविष्य के संस्करणों में किसी भी प्रकार के MD5 कार्यान्वयन को वापस करने में लचीलापन है ? इसका रिटर्न प्रकार 'MD5' है, इसलिए यदि आप चाहते हैं कि आपका प्रोग्राम नवीनतम कार्यान्वयन का उपयोग करे, तो 'MD5.Create()' विधि का उपयोग करें। – Ben

+0

सी # के लिए एक सार वर्ग के उदाहरण को वापस करने के लिए कैसे संभव है? मैंने सोचा कि एक अमूर्त वर्ग का पूरा उद्देश्य यह था कि इसे तत्काल नहीं किया जा सकता है, लेकिन इसके विरासत वाले बच्चे ही कर सकते हैं। – silkfire

+0

MD5.Create() MD5CryptoServiceProvider को वापस कर रहा है MD5 सार वर्ग नहीं। –

11

जैसा कि जेसन रोवे ने उल्लेख किया है (कृपया उसके उत्तर के लिए वोट दें, यह केवल चेतावनी का एक शब्द है), कोई कार्यात्मक अंतर नहीं है। हालांकि, यदि आप MD5Managed पर विचार कर रहे हैं (या नाम में Managed के साथ कोई क्रिप्टोग्राफी क्लास) पर कोई अंतर है। समूह नीति के माध्यम से FIPS-compliant एन्क्रिप्शन एल्गोरिदम सक्षम होने पर Managed नामित कक्षाओं का उपयोग नहीं किया जा सकता है।

1

मेरा 2 सेंट।

MD5 एक छोटे से भूमि के ऊपर कहते हैं और यह MD5CryptoServiceProvider

की तुलना में धीमी है मैं सिर्फ एक छोटे से तनाव परीक्षण एक स्ट्रिंग की 300k हैश पैदा भाग गया:

MD5CryptoServiceProvider: 00:00:01.1750834 
MD5: 00:00:01.6398959 

लगभग 1.5 गुना धीमी।

पीएस। I7 कोर लैपटॉप

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