2010-04-08 3 views
32

Im .NET-Framework gibt es ein paar Möglichkeiten, einen MD5-Hash zu berechnen, aber es gibt etwas, das ich nicht verstehe;Was ist der Unterschied zwischen der Verwendung von MD5.Create und MD5CryptoServiceProvider?

Was ist der Unterschied zwischen den folgenden? Was unterscheidet sie voneinander? Sie scheinen identische Ergebnisse zu erzeugen:

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(); 
    } 

Antwort

29

System.Security.Cryptography.MD5.Create() schafft tatsächlich eine MD5CryptoServiceProvider. Deshalb sehen Sie die gleichen Ergebnisse.

Blick auf die Definition MD5 ist die Basisklasse und es ist abstrakt. Ich nehme an, dass sie die öffentliche create-Funktion für die Benutzerfreundlichkeit hinzugefügt haben.

Werfen Sie einen Blick auf die Definitionen.

MD5 Repräsentiert die abstrakte Klasse, von der alle Implementierungen des MD5-Hashalgorithmus erben.

MD5CryptoServiceProvider Berechnet den MD5-Hashwert für die Eingabedaten mithilfe der vom Kryptografiedienstanbieter (CSP) bereitgestellten Implementierung. Diese Klasse kann nicht vererbt werden.

+2

Würdest du die 'MD5.Create()' Methode als eine Art Factory-Methode betrachten, die eine 'MD5CryptoServiceProvider'-Instanz heute erneut ausführen kann, aber die Flexibilität hat, irgendeine Art von MD5-Implementierung in zukünftigen Versionen zurückzugeben ? Der Rückgabetyp ist 'MD5'. Wenn Sie möchten, dass Ihr Programm die neueste Implementierung verwendet, verwenden Sie die' MD5.Create() 'Methode. – Ben

+0

Wie ist es möglich, dass C# eine Instanz einer abstrakten Klasse zurückgibt? Ich dachte, der ganze Zweck einer abstrakten Klasse sei, dass sie nicht instanziiert werden kann, aber ihre ererbten Kinder können. – silkfire

+0

MD5.Create() gibt einen MD5CryptoServiceProvider nicht die abstrakte MD5-Klasse zurück. –

11

Wie Jason Rowe erwähnt (bitte stimme für seine Antwort, dies ist nur ein Wort der Warnung), gibt es keinen funktionalen Unterschied. Es gibt jedoch einen Unterschied, wenn Sie MD5Managed (oder eine Kryptografieklasse mit Managed im Namen) betrachten. Managed -named Klassen können nicht verwendet werden, wenn FIPS-kompatible Verschlüsselungsalgorithmen über Gruppenrichtlinien aktiviert sind.

1

Meine 2 Cent.

MD5 fügt ein wenig Overhead und es langsamer ist im Vergleich zu MD5CryptoServiceProvider

Ich lief nur ein wenig Stresstest zu erzeugen 300k Hashes eines Strings:

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

Fast 1,5-mal langsamer.

PS. Getestet auf einem i7-Core-Laptop

Verwandte Themen