ページ

2010年12月5日日曜日

C#勉強中 .NET でファイルハッシュ

Cryptographical Hash しか無いようです。MD5やSHA1はあるのですが、CRC系列はシェアウェアで販売されているものしか見つかりませんでした。わざわざ販売しているわけですから、.NETネイティブには無いのでしょう。MD5を使って、サイズと比較計算負荷(まあたいしたものではないですが)を我慢するかCRCコードを自作するか。CRC計算コード自体は(規格化されているので)いくらでも手に入りますが、ファイルI/Oチューニングしないと意味ないですし。今回はMD5でいくことにしましょう。まとめると以下のようなコードになります。

    class MD5sum
    {
        static private System.Security.Cryptography.MD5CryptoServiceProvider md5 = null;

        public static string gethash(Stream ifs)
        {
            if (md5 == null)
            {
                md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            }
            Byte[] sum = md5.ComputeHash(ifs);
            return BitConverter.ToString(sum).ToLower().Replace("-", "");
        }
        public static string gethash(string fn)
        {
            FileStream ifs = File.OpenRead(fn);
            string sum = gethash(ifs);
            ifs.Close();
            return sum;
        }
    }

[HOW TO] Visual Basic .NET を使用したハッシュ値の計算および比較方法

ハッシュ値による不一致チェックの話が出ているので、目的にあってはいるのですが、それでもMD5ベース。CRCレベルで充分なのですがね。

MD5やSHA1などでハッシュ値を計算する: .NET Tips: C#, VB.NET, Visual Studio

Cryptographical Hashの方ですね。ファイルのシグニチャ作成なので、もっと軽量のものがあればそっちにしたいですね。速度面CPU負荷の問題がなければこれでもOKですが。出力が文字列ベースなので比較に時間がかかるところが難です。

AdvancedFilesInformation by FBE

ファイルのCRC32,MD5を求めるプログラム。アーカイブになっているので、展開してみないと判りません。ソース付きかどうか。

展開してみました。コード付き(VB)です。内容は、まあ、普通のCRC/MD5コードですね。テーブルを使って計算を高速化、ブロックI/Oでファイル読み込みを高速化、ぐらいはしています。サンプルとしては悪くないと思いますが、今回の目的にはいまひとつ、といったところです。

0 件のコメント:

コメントを投稿