В платформе.NET существует несколько способов вычислить хеш 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();
}
System.Security.Cryptography.MD5.Create () фактически создает MD5CryptoServiceProvider. Вот почему вы видите такие же результаты.
Если посмотреть на определение, MD5 - это базовый класс, и он абстрактный. Я предполагаю, что они добавили публичную функцию создания для простоты использования.
public sealed class MD5CryptoServiceProvider : MD5
public abstract class MD5 : HashAlgorithm
Взгляните на определения.
MD5 Представляет абстрактный класс, от которого наследуются все реализации хеш-алгоритма MD5.
MD5CryptoServiceProvider Вычисляет значение хеш-функции MD5 для входных данных, используя реализацию, предоставленную поставщиком криптографических услуг (CSP). Этот класс не может быть унаследован.
Как сказал Джейсон Роу (пожалуйста, проголосуйте за его ответ, это всего лишь предупреждение), функциональной разницы нет. Однако есть разница, если вы рассматриваете MD5Managed
(или любой класс криптографии с Managed
в имени). Управляемые классы с именами
не могут использоваться, если через групповую политику включены алгоритмы шифрования, совместимые с FIPS.