6

ハッシュ計算のパフォーマンスを向上させるために、ネイティブ MD5 または SHA1 ライブラリへの ac# ラッパーを探しています。

以前、SharpZipLib を zlib に切り替えたところ、パフォーマンスが 2 倍以上向上しました。(OK、OS とハードウェアに応じて適切な zlib.so または zlib.dll を使用するように注意する必要がありますが、それは報われます)。

MD5 や SHA1 にとって価値があるでしょうか、それとも .NET と Mono の両方が既にネイティブ実装に依存しているのでしょうか?

(編集済み) また: MD5CryptoServiceProvider に固執しなければならない場合、ファイルの読み取り中にファイルのハッシュを計算する方法はありますか? つまり、バイトをチャンクで送信しますが、それでもハッシュ全体を計算しますか?

4

4 に答える 4

16

MD5 と SHA1 はネイティブ実装に依存していますが、メソッド呼び出しの数を少し減らしてネイティブ実装を最適化できる可能性があるため、C++ ソリューション + introp の方がわずかに高速になる可能性があります。

ネイティブ (SHA1CryptoServiceProvider) は、マネージド (SHA1Managed) よりも 3 倍高速になる可能性があることに注意してください。

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();
        }
    }
}
管理経過時間 891 ミリ秒
管理されていない経過時間 336 ミリ秒

また、私の計算が間違っていない限り、管理されていない実装は約 300 ミリ秒で 100 MB のデータをハッシュしていることに注意してください。これがボトルネックになることはほとんどありません。

于 2009-06-27T00:15:16.550 に答える
3

このSHA1CryptoServiceProviderクラスは、基になる Windows API 実装を使用します。ただし、SHA1Managedかなり速いです。

編集:はい、ハッシュを段階的に計算することは可能です。TransformBlockおよびTransformFinalBlockメソッドがこれを行います。

于 2009-06-27T00:11:25.543 に答える
0

ハッシュのアプリケーションによっては、MD5 が適用できない場合があります。MD5 はエラー修正にのみ役立ちます。悪意のあるファイルの改ざんに対するチェックとしてはもはや実行できません。

http://en.wikipedia.org/wiki/Md5#脆弱性

簡単に言うと、MD5 衝突は、ファイル内の 16 バイトを変更することで簡単に生成できます。

于 2009-06-27T02:53:24.327 に答える
0

BCL のSHA1およびMD5CryptoServiceProviderクラスを使用するだけです。フレームワークに同梱されているものは非常に高速です。

于 2009-06-27T00:11:52.593 に答える