| ■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秒程度かかりました。
|
|