В чем разница между использованием MD5.Create и MD5CryptoServiceProvider?
В .NET framework существует несколько способов вычисления хэша MD5, но, похоже, я чего-то не понимаю;
Какое различие между следующим? Что отличает их друг от друга? Кажется, что они дают одинаковые результаты:
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();
}
Ответы
Ответ 1
System.Security.Cryptography.MD5.Create() на самом деле создает MD5CryptoServiceProvider. Вот почему вы видите те же результаты.
Глядя на определение, MD5 является базовым классом и является абстрактным. Я предполагаю, что они добавили функцию public create для простоты использования.
public sealed class MD5CryptoServiceProvider : MD5
public abstract class MD5 : HashAlgorithm
Взгляните на определения.
MD5 Представляет абстрактный класс, из которого наследуются все реализации алгоритма хеширования MD5.
MD5CryptoServiceProvider Вычисляет хеш-значение MD5 для входных данных, используя реализацию, предоставляемую поставщиком криптографических услуг (CSP). Этот класс не может быть унаследован.
Ответ 2
Как упоминал Джейсон Роу (проголосовать за его ответ, это всего лишь слово предупреждения), функциональной разницы нет. Однако существует разница, если вы рассматриваете MD5Managed
(или любой класс криптографии с Managed
в имени). Managed
-именованные классы не могут использоваться, когда алгоритмы шифрования, совместимые с FIPS, разрешены с помощью групповой политики.
Ответ 3
Мои 2 цента.
MD5
добавляет немного накладных расходов и работает медленнее по сравнению с MD5CryptoServiceProvider
Я просто провел небольшое стресс-тест, создав хэши 300k строки:
MD5CryptoServiceProvider: 00:00:01.1750834
MD5: 00:00:01.6398959
Почти в 1,5 раза медленнее.
PS. Протестировано на ноутбуке i7 core