2009-06-27 15 views
6

Karma hesaplama performansını artırmak için yerel bir MD5 veya SHA1 kitaplığına bir C# sarmalayıcı arıyorum.C# hızlı karma hesaplama

Daha önce SharpZipLib'i zlib'e değiştirdim ve 2x'den fazla performans artışı elde ettim. (Tamam, OS ve donanım bağlı doğru zlib.so veya zlib.dll size dikkat çekmek, ama o ödüyor).

MD5 veya SHA1 için ya da .NET ve Mono için yerel bir uygulamaya zaten gerek duyulur mu?

(Düzenlendi) Ayrıca: MD5CryptoServiceProvider'a yapıştırmam durumunda, okuduğum sırada bir dosyanın karma değerini hesaplayabileceğim bir yöntem var mı? Yani, baytları parçalara gönder ama yine de bütün hashı hesapla?

+1

MD5'in bozuk bir karma algoritma olduğunu ve artık güvenli olarak kabul edilmediğini unutmayın. SHA1 ile çarpışmalar da bulunmuştur ve MD5 kadar şiddetli olmasa da, önemli kırılmalar olarak kabul edilmiştir. Güvenli bir karma algoritmaya ihtiyacınız varsa, SHA2 türevlerini (256/512) seçmelisiniz. – jrista

+0

@pablo, IO erişiminin sizin darboğazlığınız olduğundan emin misiniz? –

+0

Ayrıca IO olabilirsiniz, haklısınız, ancak zlib ile ilgili deneyimlerimden sonra, MD5 uygulamasının geçişini hızlandırıp artırmayacağını düşünmekteyim. – pablo

cevap

3

SHA1CryptoServiceProvider sınıfı, temel Windows API uygulamasını kullanır. Bununla birlikte, SHA1Managed oldukça hızlıdır.

DÜZENLEME: Evet, karma adım adım hesaplamak mümkün. TransformBlock ve TransformFinalBlock yöntemleri bunu yapar.

+0

Oldukça hızlı demek birçok şey ifade edebilir ... oldukça hızlı 3 kez daha yavaş anlamına gelir .... hala 300ms başına 30MB bol miktarda hızlı –

0

Sadece BCL'nin SHA1 ve MD5CryptoServiceProvider sınıflarını kullanırdım. Çerçeve ile birlikte gelenler oldukça hızlı.

+0

Teşekkürler. Şu an kullandığım şey bu, sadece daha hızlı yapmanın bir yolu olup olmadığını merak ediyorum. Tüm dosyalarımı alıyorum. – pablo

16

MD5 ve SHA1 yerel uygulamalara dayanır; bununla birlikte, bir C++ çözümü + intropu biraz daha hızlı olabilir, bu nedenle yöntem çağrılarının sayısını biraz azaltabilir ve yerel uygulamayı en iyi duruma getirebilirsiniz. Yerel (SHA1CryptoServiceProvider) öğesinin yönetilen olandan (SHA1Managed) 3 kat daha hızlı olabileceğini unutmayın. Benim hesaplama yanlış değilse

 
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(); } } } 

Ayrıca yönetilmeyen uygulama yaklaşık 300 milisaniyede verilerin 100MB karma olduğu akılda
bulunsun, bu çok nadiren bir darboğaz olacaktır.

+0

Bir birlikte çalışma çözümü, aksi halde gerçekleştirilebilecek diğer kazançları azaltabilecek şekilde marşlama gerektirir. Sadece akılda tutulması gereken bir şey. – jrista

+0

benim anlayışım SHA1CryptoServiceProvider zaten marshalling gerektirir, onun extern çağrıları kullanarak –

+0

Bu mantıklı. – pablo

0

Çentik uygulamanıza bağlı olarak, MD5 uygulanabilir olmayabilir. MD5 yalnızca hata düzeltme konusunda faydalıdır, artık kötü niyetli dosya değişikliklerine karşı bir kontrol olarak artık geçerli değildir.

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

öykü MD5 çarpışmalar bir dosyada 16 bayt değiştirerek üretmek kolaydır vardır.