2011-02-09 18 views
5

Bu bir üniversite ödevi olmasına rağmen (ödev) düşünebildiğim en iyi çözüme ulaştım. Ben bu kod ile tam işaretleri elde ediyorum, bu soruya uyuyor, ancak Java'yı kullanan herkesin yerine C# içinde geliştirmeye özel olarak izin verilmiştim, bir tür "yeh, ne C# ne yapabilirim" sorunu ;-)Performans ayarlama C# permütasyonları ve SHA1 kodu

Soru:

SHA1 hash'ının parola değerini bulmak için bir program oluşturun, parolaların 6 karakter uzunluğunda olduğunu ve yalnızca küçük-büyük ve 0-9'u içerdiğini varsayalım.

Bir LINQ sorgusu oluşturdum ve olası birleşimlerimden sonra bir karma alma ve sağlanan parola karmasıyla karşılaştırmak için SHA1 aracılığıyla çalıştırmam gerekiyor.

Bu kodu oluşturuldu: Şimdi benim asıl sorun hızla kolay şifreleri çözüldü olmasıdır

public static string BruteForceHash(string hash) 
     { 

       var results = from c0 in Enumerable.Range(0, 36) 
           from c1 in Enumerable.Range(0, 36) 
           from c2 in Enumerable.Range(0, 36) 
           from c3 in Enumerable.Range(0, 36) 
           from c4 in Enumerable.Range(0, 36) 
           from c5 in Enumerable.Range(0, 36) 
           select new string(
            new[] 
           { 
            Characters[c0], 
            Characters[c1], 
            Characters[c2], 
            Characters[c3], 
            Characters[c4], 
            Characters[c5], 
           } 
           ); 

       string found = null; 
       Parallel.ForEach(results, (result, loopstate, a) => 
               { 
                string hashed = SHA1(result, Encoding.Default); 

                if (hashed == hash) 
                { 
                 found = result; 
                 loopstate.Break(); 
                } 
               }); 

       if (found != null) 
       { 
        return found; 
       } 

      return "Not found."; 
     } 

("aaaaaa" anlık) ama açıkçası alır daha uzun ayrıca şifre uzakta "aaaaaa" değil.

Birisinin performansın nasıl artırılacağı konusunda bazı göstergeler sağlayabileceğini umuyorum.

+1

Baştan aşağı azaltın, bu sadece ilgili. 6 karakter kullanılan bir SHA1 uygulamasını elden geçirebilirsiniz. Enumerable.Range'ı neden kullandığınız gibi GC yükünü azaltmaya çalışabilirdiniz? Neden olmasın: 'Karakterlerden c1'den? Ayrıca, denemeye göz atabilirsiniz: dizi tabanlı dize yapıcılarınız yerine '((+) + c0 + c1 + c 2) + (" "+ c3 + c4 + c5)' yi seçin. Ancak, bu sadece göstermeye başlar, kaba kuvvet yavaştır. –

+2

"Çekirdekleri çok büyük bir kutuda çalıştır" sayılır mı? Heck, masmavi bir kümede çalıştır ... –

+0

@marc: LOL! :) .... –

cevap

2

Uygulamadan oldukça memnunsanız, kodu YourKit veya DotTrace gibi bir performans uzmanı ile koyardım, koddaki sıcak noktaya bakabilir ve oradan ayarlamaya bakabilirsiniz. Bazen LINQ gibi sözdizimsel şekerli kod kullandığınızda bunu yapmak güzel, bu şekilde gerçekten kaputun altında neler olup bittiğini bir fikir elde edebilirsiniz ...