2010-04-08 18 views
32

W środowisku .NET istnieje kilka sposobów obliczania skrótu MD5, jednak wydaje się, że jest coś, czego nie rozumiem;Jaka jest różnica między używaniem MD5.Create i MD5CryptoServiceProvider?

Jaka jest różnica między poniższymi? Co odróżnia je od siebie? Wydają się produkować identyczne wyniki:

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

Odpowiedz

29

System.Security.Cryptography.MD5.Create() jest faktycznie tworzenia MD5CryptoServiceProvider. Dlatego widzisz te same wyniki.

Patrząc na definicję MD5 jest klasą bazową i jest abstrakcyjna. Zgaduję, że dodali funkcję tworzenia publicznych dla łatwości użycia.

public sealed class MD5CryptoServiceProvider : MD5 

public abstract class MD5 : HashAlgorithm 

Spójrz na definicje.

MD5 Reprezentuje klasę abstrakcyjną, z której dziedziczą wszystkie implementacje algorytmu mieszania MD5.

MD5CryptoServiceProvider Oblicza wartość skrótu MD5 dla danych wejściowych za pomocą implementacji dostarczonej przez dostawcę usług kryptograficznych (CSP). Ta klasa nie może zostać odziedziczona.

+2

Czy uważasz, że metoda 'MD5.Create()' jest rodzajem metody fabrycznej, która może ponownie uruchomić instancję 'MD5CryptoServiceProvider' dzisiaj, ale ma elastyczność pozwalającą na zwrócenie dowolnego typu implementacji MD5 w przyszłych wersjach ? Jego typem jest 'MD5', więc jeśli chcesz, aby twój program korzystał z najnowszej implementacji, użyj metody' MD5.Create() '. – Ben

+0

Jak to możliwe, że C# zwraca instancję klasy abstrakcyjnej? Sądziłem, że głównym celem klasy abstrakcyjnej jest to, że nie można jej utworzyć, ale odziedziczone przez nią dzieci mogą. – silkfire

+0

MD5.Create() zwraca MD5CryptoServiceProvider, a nie klasę abstrakcyjną MD5. –

11

Jak wspomniał Jason Rowe (proszę głosuj na jego odpowiedź, to tylko słowo ostrzeżenia), nie ma różnicy funkcjonalnej. Jest jednak różnica, jeśli rozważasz MD5Managed (lub dowolną klasę kryptograficzną z Managed w nazwie). Managed - Nazwane klasy nie mogą być używane, gdy algorytmy szyfrowania zgodne z FIPS są włączone za pośrednictwem zasad grupy.

1

Moje 2 centy.

MD5 dodaje trochę napowietrznych i jest wolniejszy porównaniu MD5CryptoServiceProvider

ja po prostu zabrakło trochę stress test generujący 300K mieszań łańcucha znaków:

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

prawie 1,5-krotnie wolniejszy.

PS. Testowany na laptopie z rdzeniem i7

Powiązane problemy