2009-06-27 2 views
6

Я ищу оболочку C# для собственной библиотеки MD5 или SHA1, чтобы улучшить производительность вычисления хеша.C# быстрый хеш-расчет

Раньше я переключил SharpZipLib на zlib и получил повышение производительности более чем на 2 раза. (хорошо, вы должны позаботиться, что у вас есть право zlib.so или zlib.dll в зависимости от ОС и оборудования, но оно окупается).

Будет ли стоить MD5 или SHA1, или как .NET, так и Mono полагаться на собственную реализацию?

(Отредактировано) Также: на случай, если я должен придерживаться MD5CryptoServiceProvider, есть способ, которым я могу вычислить хэш файла, пока я его читаю? Я имею в виду, отправлять байты в куски, но все же рассчитать весь хеш?

+1

Имейте в виду, что MD5 является треснувшим алгоритмом хэширования и больше не считается защищенным. Столкновения с SHA1 также были обнаружены и, хотя они не столь серьезны, как MD5, они считались значительными перерывами. Если вам нужен безопасный алгоритм хэширования, вы должны выбрать варианты SHA2 (256/512). – jrista

+0

@pablo, вы уверены, что хеширование, а не доступ к IO - это ваше узкое место ... –

+0

Это тоже может быть IO, вы правы, но после моего опыта работы с zlib я думал, будет ли переключение MD5 на ускорение. – pablo

ответ

3

Класс SHA1CryptoServiceProvider использует базовую реализацию API Windows. Однако SHA1Managed довольно быстро.

EDIT: Да, шаг за шагом можно вычислить шаг. Это делают методы TransformBlock и TransformFinalBlock.

+0

довольно быстро может означать много вещей ... получается довольно быстро означает 3 раза медленнее .... все еще 30 МБ за 300 мс очень быстро –

0

Я бы просто использовал классы BC и MD5CryptoServiceProvider. Те, которые поставляются с каркасом, довольно быстр.

+0

Спасибо. Вот что я сейчас использую, мне просто интересно, есть ли способ сделать это быстрее. Я цепляю целые файлы. – pablo

16

MD5 и SHA1 полагаются на собственные реализации, тем не менее его возможное решение C++ + introp может быть немного быстрее, потому что вы можете немного сократить количество вызовов методов и оптимизировать собственную реализацию.

Имейте в виду, что Native (SHA1CryptoServiceProvider) может быть на 3 раза быстрее, чем управляемый (SHA1Managed).

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.Security.Cryptography; 

namespace ConsoleApplication22 { 



    class Program { 

     static void Profile(string description, int iterations, Action func) { 

      // clean up 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      GC.Collect(); 

      // warm up 
      func(); 

      var watch = Stopwatch.StartNew(); 
      for (int i = 0; i < iterations; i++) { 
       func(); 
      } 
      watch.Stop(); 
      Console.Write(description); 
      Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds); 
     } 

     static void Main() { 
      SHA1Managed managed = new SHA1Managed(); 
      SHA1CryptoServiceProvider unmanaged = new SHA1CryptoServiceProvider(); 

      Random rnd = new Random(); 

      var buffer = new byte[100000]; 
      rnd.NextBytes(buffer); 

      Profile("managed", 1000,() => { 
       managed.ComputeHash(buffer, 0, buffer.Length); 
      }); 

      Profile("unmanaged", 1000,() => 
      { 
       unmanaged.ComputeHash(buffer, 0, buffer.Length); 
      }); 

      Console.ReadKey(); 
     } 
    } 
} 
 
managed Time Elapsed 891 ms 
unmanaged Time Elapsed 336 ms 

Имейте также в виду если мой расчет не так, неуправляемый реализация хеширования 100MB данных примерно 300 миллисекунд, то это было очень редко является узким местом.

+0

Решение interop потребовало бы сортировки, однако это могло бы смягчить любые другие выгоды, которые в противном случае могли бы быть сделаны. Просто нужно иметь в виду. – jrista

+0

Я понимаю, что SHA1CryptoServiceProvider требует все равно, используя внешние вызовы –

+0

Это имеет смысл. – pablo

0

В зависимости от вашего применения хеширования MD5 может быть неприменим. MD5 полезен только при исправлении ошибок, он не является более жизнеспособным, как проверка на изменение вредоносного файла.

http://en.wikipedia.org/wiki/Md5#Vulnerability

Короткий рассказ, MD5 столкновения легко генерировать путем изменения 16 байт в файле.