初めまして、ファイルからMD5値を取得するソフトを作りたいと思っているのですが
ファイルサイズが大きくなると(100MB超)処理に時間がかかります。
ファイルからバイナリ取得の段階がボトルネックとなっているので何か良い方法はないでしょうか?
(ファイルからバイナリを読み込むのは初めてで、やり方自体間違ってるかもしれませんTT;)
'バッファサイズ毎に読み込み
For counter = 0 To Int(FileSize / Buffer) - 1
'指定バイト分を読み込みバッファへ
BufferArray = r.ReadBytes(Buffer)
'バイト配列へバッファからコピー
BufferArray.CopyTo(ByteArray, counter * Buffer)
Next
この後FileSize mod Buffer(残り)をbytearrayへ追加
bytearrayをhttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemsecuritycryptographymd5classtopic.asp
使用しMD5値を求める
追記
Dim fs As New System.IO.FileStream(FilePath, IO.FileMode.Open, System.IO.FileAccess.Read)
Dim r As New System.IO.BinaryReader(fs)
> ファイルサイズが大きくなると(100MB超)処理に時間がかかります。
ひゃ、100MBですか。(^_^;) それはどうやっても、時間がかかりそうですね…。
> ファイルからバイナリ取得の段階がボトルネックとなっているので
ストリームをそのまま渡すだけですよ。
Dim fs As New System.IO.FileStream(FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read)
Dim md5 As New System.Security.Cryptography.MD5CryptoServiceProvider
Dim Hash() As Byte = md5.ComputeHash(fs)
MessageBox.Show(System.BitConverter.ToString(Hash))
どうもありがとうございますm(_ _)m
こんなに簡単に・・・(^^;
初めは1byte毎にバイト配列に入れていて余りに時間が掛かるので調べつくした結果
BufferArrayに読み込むという方法に辿り着いたのです。
しかし300MBのファイルだと90000msecという結果
さらに、メモリ使用量がピーク時に350MB、仮想が900MB・・・(‾▽‾)
途中、以下のDLLを使ってしまえと思いましたがこの方法だとメモリも喰わなくて良いですね。
http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html
欲を言えばこのソフト並みの速さがほすぃ
http://kkkon.hp.infoseek.co.jp/software/wMD5sum/index.shtml