4

一部のテキストを に変換するために使用されるコードをいくつか見直していますMD5 Hash。よく働く。gravatar avatarMD5Hhashの作成に使用されます。ここにあります :-

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 ハッシュを生成し、グラバター URL を生成できるようにします。したがって、ビューはこのメソッドを数十回呼び出すことができます。

時期尚早の最適化などにストレスを感じて時間を無駄にしないでください...どちらが良いでしょうか?

4

4 に答える 4

10

私はスレッドセーフにもっと興味があります... MSDNは(私がそれを見逃していない限り)それMD5CryptoServiceProviderがスレッドセーフであるとは言いません.

どれだけ早く間違った答えを得ることができるかは関係ありません;-p

おそらく(スレッドセーフの問題を修正するために)やりたくないことは、静的インスタンスとlockその周りにあることです...それは、異なる要求で並行して実行できる場合、すべての暗号化コードをシリアル化します。

于 2009-05-20T14:23:03.710 に答える
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();
            }
        }
    }
}
于 2009-05-20T14:49:29.633 に答える
3

既存のコードは、呼び出すたびに MD5CryptoServiceProvider を再構築する手間が省けるため、わずかに高速になると予想されますが、ComputeHash() への呼び出しによって時間が支配されることも予想されます。

于 2009-05-20T14:28:21.703 に答える
2

個人的には、ページを生成するためだけに実行する必要がある他のコードのラッシングを考えてみてください。他の 1.5 ダースのうちの 6 つであり、どちらの方法でも節約できる額はごくわずかです。

于 2009-05-20T14:28:39.237 に答える