2009-05-20 10 views
4

私はいくつかのテキストをMD5 Hashに変換するために使用されています。よく働く。 gravatarアバターのためにMD5Hhashを作成するために使用されています。ここでは、次のとおりです。 -どのコードがより効果的ですか?

static MD5CryptoServiceProvider md5CryptoServiceProvider = null; 

public static string ToMD5Hash(this string value) 
{ 
    //creating only when needed 
    if (md5CryptoServiceProvider == null) 
    { 
     md5CryptoServiceProvider = new MD5CryptoServiceProvider(); 
    } 

    byte[] newdata = Encoding.Default.GetBytes(value); 
    byte[] encrypted = md5CryptoServiceProvider.ComputeHash(newdata); 
    return BitConverter.ToString(encrypted).Replace("-", "").ToLower(); 
} 

私たちは、このメソッドが呼び出されるMD5CryptoServiceProvider初めての作成方法をお知らせ? (簡単にするため、ここで競争条件について心配しないでください)。私が思っていた

は、それが高価より計算である私は今、これまで、プロバイダを作成するために使用されている行...

using(var md5CryptoServiceProvider = new MD5CryptoServiceProvider()) 
{ 
    ... snip snip snip .... 
} 

を変更した場合、どのようにこの方法は、消費/使用されていますか?さて、それはStackOverflowのホームページです - >各投稿について、ユーザーのmd5ハッシュを生成するので、彼らのgravatar URLを生成することができます。そのため、この方法は数十回と呼ばれます。

premature optimzationなどに重点を置いて時間を浪費することなく、より良い結果が得られますか?

答えて

10

私はスレッドセーフなものにもっと興味があると思います... MSDNは(私がそれを逃していない限り)MD5CryptoServiceProviderはスレッドセーフなので、IMOはコールごとに1つしか持っていないと言っています...

あなたはおそらくは、(スレッドの安全性の問題を修正するために)行うにはしたくない何

;-p間違った答えを得ることができますどのように迅速にそれを問題ではありません静的インスタンスを持っているし、 lock ...これは、さまざまなリクエストで並列に実行できるときに、すべての暗号コードをシリアル化します。

+0

「使用」ステートメントを適用することをお勧めしますか? – Overhed

+0

私は彼がすでに "using"ステートメントを含んでいる2番目の例を使用することをお勧めします。 –

+0

私は静的+ロックの場合、他のパラレルコールをブロックすることになります。ロックする必要がない場合は、右ですか?それはうまくいくかもしれませんが、遅くなることがあります。 (私はそれをするつもりはないが、あなたの答えを100%理解しようとしている)。 –

3

すべての呼び出しでMD5CryptoServiceProviderを再構築する必要がなくなり、ComputeHash()の呼び出しに支配されることを期待しています。

2

私は個人的にどちらの方法で問題になるのかわかりませんが、ページを生成するために実行する必要のある他のコードのラッシングを考えてください。そのうちの6つは、他の半分は、節約のいずれかの方法は小さいだろう。

4

それを試して、時間を計ってください。最初の方がパフォーマンスが良いですが、おそらくそれほど重要ではありません。

using System; 
using System.Diagnostics; 
using System.Security.Cryptography; 
using System.Text; 

namespace ConsoleApplication11 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Stopwatch timer=new Stopwatch(); 
      int iterations = 100000; 
      timer.Start(); 
      for (int i = 0; i < iterations; i++) 
      { 
       string s = "test" + i; 
       string t=s.ToMd5Hash0(); 
      } 
      timer.Stop(); 
      Console.WriteLine(timer.ElapsedTicks); 

      timer.Reset(); 
      timer.Start(); 
      for (int i = 0; i < iterations; i++) 
      { 
       string s = "test" + i; 
       string t = s.ToMd5Hash1(); 
      } 
      timer.Stop(); 
      Console.WriteLine(timer.ElapsedTicks); 

      Console.ReadKey(); 
     } 
    } 
    public static class Md5Factory 
    { 
     private static MD5CryptoServiceProvider md5CryptoServiceProvider; 
     public static string ToMd5Hash0(this string value) 
     { 
      if (md5CryptoServiceProvider == null) 
      { 
       md5CryptoServiceProvider = new MD5CryptoServiceProvider(); 
      } 
      byte[] newData = Encoding.Default.GetBytes(value); 
      byte[] encrypted = md5CryptoServiceProvider.ComputeHash(newData); 
      return BitConverter.ToString(encrypted).Replace("-", "").ToLower(); 
     } 
     public static string ToMd5Hash1(this string value) 
     { 
      using (var provider = new MD5CryptoServiceProvider()) 
      { 
       byte[] newData = Encoding.Default.GetBytes(value); 
       byte[] encrypted = provider.ComputeHash(newData); 
       return BitConverter.ToString(encrypted).Replace("-", "").ToLower(); 
      } 
     } 
    } 
} 
関連する問題