次の関数を使用して、VS2008、.NET 3.5 プロジェクトのファイルの CRC32 を計算しています。
public UInt32 ComputeHash(System.IO.Stream stream)
{
unchecked
{
const int BUFFER_SIZE = 1024;
UInt32 crc32Result = 0xFFFFFFFF;
byte[] buffer = new byte[BUFFER_SIZE];
int count = stream.Read(buffer, 0, BUFFER_SIZE);
while (count > 0)
{
for (int i = 0; i < count; i++)
{
crc32Result = ((crc32Result) >> 8) ^ _crc32Table[(buffer[i]) ^ (crc32Result) & _LOOKUP_TABLE_MAX_INDEX];
}
count = stream.Read(buffer, 0, BUFFER_SIZE);
}
return ~crc32Result;
}
}
簡潔にするために、ルックアップ テーブル (_crc32Table) を作成する関数は省略しています。テーブルは UInt32 の配列であり、クラスがインスタンス化されるときに構築され、256 個の値を含みます (256 は _LOOKUP_TABLE_MAX_INDEX + 1 の値でもあります)。
これを MD5CryptoServiceProvider および SHA1CryptoServiceProvider ComputeHash 関数と比較していくつかのベンチマークを実行しましたが、はるかに高速です。MD5 関数は 2 倍以上高速で、SHA1 ハッシュは約 35% 高速です。CRC32 は速いと言われましたが、それは私が見ているものではありません。
私の仮定は間違っていますか?これは予想されることですか、それともこのアルゴリズムに欠陥がありますか?