我正在使用以下函数计算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内置函数调用本机库并通过不必在托管内存框架内运行进行欺骗。

08-26 20:06