我正在使用以下函数计算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也是查找表最大索引+1的值)。
我运行了一些基准测试,将其与md5cryptoserviceprovider和sha1cryptoserviceprovider computehash函数进行了比较,它们的速度要快得多。md5函数的速度是原来的两倍多,sha1散列的速度大约是原来的35%。有人告诉我CRC32很快,但那不是我看到的。
我的假设错了吗?这是预料之中的,还是这个算法有缺陷?
最佳答案
您正在将代码与内置函数进行比较,并询问它们为什么更快。您需要做的是找到内置函数的源代码。它们是如何工作的?看看有什么不同。
betcha内置函数调用本机库并通过不必在托管内存框架内运行进行欺骗。