MD5와 SHA1은 네이티브 구현에 의존하지만 C++ 솔루션 + introp은 약간 더 빠를 수 있습니다. 즉, 메소드 호출 수를 줄이고 기본 구현을 최적화 할 수 있기 때문입니다.
네이티브 (SHA1CryptoServiceProvider)이 빠르게 관리 하나 (SHA1Managed)에 비해 3 배 될 수 있음을 유의하십시오. 내 계산이 잘못되지 않는 한
managed Time Elapsed 891 ms
unmanaged Time Elapsed 336 ms
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(); } } }
는 또한 관리되지 않는 구현이 약 300 밀리 초에 100MB의 데이터를 해싱되어, 마음하십시오, 이것은 매우 드물게 병목 없을 것이다.
MD5는 금이 간 해싱 알고리즘이므로 더 이상 보안이 적용되지 않습니다. SHA1과의 충돌도 발견되었으며, MD5만큼 심각하지는 않지만 심각한 장애로 간주되었습니다. 보안 해싱 알고리즘이 필요한 경우 SHA2 변형 (256/512)을 선택해야합니다. – jrista
@pablo, 입출력 액세스가 병목 현상이 아니라고 확신하십니까? –
또한 IO가 될 수도 있습니다.하지만 zlib에 대한 경험을 통해 MD5 구현을 전환 할 때 속도가 향상 될지 여부를 생각하고있었습니다. – pablo