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();
}
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
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
MD5.Create() zwraca MD5CryptoServiceProvider, a nie klasę abstrakcyjną MD5. –