我使用以下函数来计算 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 很快,但这不是我所看到的。
我的假设有误吗?这是预期的结果还是该算法存在缺陷?
您将代码与内置函数进行比较,并询问为什么它们更快。您需要做的是找到内置函数的源代码。它们是如何工作的?看看有什么不同。
当然,内置函数调用本机库并通过不必在托管内存框架内运行来进行欺骗。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)