我正在使用以下函数来计算 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 函数的速度是原来的两倍多,而 SHA1 哈希则快了大约 35%。有人告诉我 CRC32 很快,但这不是我所看到的。
我的假设有误吗?这是意料之中的还是这个算法有缺陷?