C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 140 を表示中)
■82326 / )  VBでCRC32を高速で計算する方法
□投稿者/ ぎゅんぎゅ (1回)-(2017/01/02(Mon) 20:51:06)

分類:[.NET 全般] 



VB.NETで、ファイルからCRC32ハッシュを高速で計算する方法を教えてください。

http://dotnet-snippets.com/snippet/calculate-crc32-hash-from-file/587

このページにあるコードを使うと
ハッシュを得ることができるのですが、
500MBのファイルのハッシュを計算するのに5秒くらいかかります。

一方で、WinRARを使って
同じ500MBのファイルを無圧縮zipファイルに変換すると
1〜2秒程度で生成することができ、CRCも得ることができます。

一体、どうすればこのように高速にCRCを得ることができるのでしょうか?


https://code.msdn.microsoft.com/office/VBACRC-32-dad7d087

このページには4KBずつ読み込めば8〜10倍程度速くなると書かれてあります。

VBA用に書かれたものなので
以下のようにVB.NET用に書き換えて使ってみたのですが
5倍くらい遅くなってしまいました。

WinRARではどういうアルゴリズムを使っているのでしょうか?


Public Function GetCRC32(ByVal sFileName As String) As String
Dim R&, I%, FN%, FL&
Dim Buf() As Byte
If Crc32Table(255) = 0 Then InitCrc32Table()



Using stream As Stream = File.OpenRead(sFileName)
Using reader As New BinaryReader(stream)
FL = stream.Length


'FL = LOF(FN)
R = Not 0
ReDim Buf(4095)
While FL > 0
If FL < 4096 Then ReDim Buf(FL - 1)
Buf = reader.ReadBytes(Buf.Length) 'Get #1, , buf()

'Get #FN, , Buf
For I = 0 To UBound(Buf)
R = (Int(R / 256) And &HFFFFFF) Xor Crc32Table((R Xor Buf(I)) And &HFF)
Next I
FL = FL - UBound(Buf) - 1
End While

End Using
End Using

GetCRC32 = Not R


End Function




http://dobon.net/vb/dotnet/string/filemd5.html

ちなみに、このページの方法を使ってMD5の計算も行ってみたのですが
CRC32と同じく5秒程度かかりました。


返信 編集キー/


管理者用

- Child Tree -