2009-05-20 5 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

나는 thread-safefy에 더 관심이 있습니다 ... MSDN은 (내가 그것을 놓치지 않았다면) MD5CryptoServiceProvider은 thread-safe라고 말합니다. 따라서 IMO는 통화 당 하나의 옵션을 가지고 있습니다 ...

그것은 정적 인스턴스가 당신이 아마 하지이 (스레드 안전 문제를 해결하기 위해) 원하는 작업

;-p 잘못된 답변을 얻을 수있는 방법을 빨리되는 문제가되지 않으며, 그것 주위에 lock ... 다른 요청에 병렬로 실행할 수있을 때 모든 암호화 코드를 직렬화합니다.

+0

그래서 "사용"문장을 적용 할 것을 제안하셨습니까? – Overhed

+0

나는 그것이 "사용"문장을 이미 포함하고있는 두 번째 예제를 사용하는 것이 좋습니다. –

+0

만약 내가 정적 + 자물쇠, 그 일을 할 것입니다 다른 병렬 호출을 차단하는 것입니다 .. 내가 자물쇠를 할 필요가 없습니다, 맞죠? 작동하지만 waaay가 느려질 수 있습니다. (나는 그 일을하고자하는 것이 아니며 단지 100 % 답을 이해하려고 노력하고 있습니다). –

3

모든 코드에서 MD5CryptoServiceProvider를 재구성하지 않고 기존 코드를 약간 빠르게 처리 할 수있을 것으로 기대하지만 ComputeHash()를 호출 할 때가 많은 것으로 예상됩니다.

2

필자는 개인적으로 어느 쪽이든 상관 없지만 페이지를 생성하기 위해 실행해야하는 다른 코드를 래싱한다고 생각하지 않습니다. 그 중 여섯 개는 여섯 개이며 나머지는 여섯 개나됩니다.

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(); 
      } 
     } 
    } 
} 
관련 문제