Подтвердить что ты не робот

В чем разница между использованием 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();
    }
4b9b3361

Ответ 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