Насколько дорогое поколение MD5 в .NET? - PullRequest
7 голосов
/ 07 января 2009

Для взаимодействия с внешним потоком данных мне нужно передать скользящий ключ безопасности, который был хэширован MD5 (каждый день нам нужно генерировать новый хэшированный ключ MD5).

Я торгую вне зависимости от того, будем ли мы делать это каждый раз, когда мы вызываем внешний канал, или нет. Мне нужно, чтобы в ленте была строка длиной около 10 символов.

Это для сайта ASP.NET (C # / .NET 3.5), и канал используется практически на каждой странице. Буду ли я лучше генерировать хэш один раз в день, а затем сохранять его в кеше приложения и получать доступ к памяти или генерировать его при каждом запросе?

Ответы [ 5 ]

14 голосов
/ 07 января 2009

Единственной приемлемой основой для оптимизации являются данные. Мера, генерирующая это inline, и мера кеширования.

Моя высокопроизводительная рабочая станция может рассчитывать более 100 000 MD5-хешей 10-байтового сегмента данных в секунду. Кэширование этого для меня не принесет никакой пользы, и я уверен, что для вас это тоже самое.

3 голосов
/ 07 января 2009

Сгенерировать пример данных. Ну, очень много. Вычислить MD5 данных образца. Измерьте время, которое требуется. Решай сам.

0 голосов
/ 07 января 2009

Использование кэша Asp.Net очень просто, поэтому я не понимаю, почему вы не должны кэшировать ключ.

Хранение ключа в кеше может даже сэкономить некоторую память, поскольку вы можете использовать его повторно вместо создания нового для каждого запроса.

0 голосов
/ 07 января 2009

Рассчитайте временную сложность алгоритма!

Посмотрите на следующий код:

   public string GetMD5Hash(string input)
    {
        System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
        byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
        bs = x.ComputeHash(bs);
        System.Text.StringBuilder s = new System.Text.StringBuilder();
        foreach (byte b in bs)
        {
            s.Append(b.ToString("x2").ToLower());
        }
        string password = s.ToString();
        return password;
    }

Если бы мы вычислили сложность времени, мы получили бы T = 11 + n * 2, однако это всего лишь «то, что мы видим», т. Е. ToLower может выполнить тяжелую работу, которую мы не знаем. Но с этого момента мы можем видеть, что этот алгоритм является O (n) во всех случаях. Значение времени увеличивается с ростом данных.

Также, чтобы решить проблему с кешем, я бы предпочел, чтобы моя «тяжелая» работа с памятью была менее затратной по сравнению с использованием ЦП.

0 голосов
/ 07 января 2009

Если это будет то же самое для данного дня кэширования, это может быть идеей. Вы даже можете установить кэш на 24 часа и написать код для регенерации хэша по истечении срока действия кеша

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...