相关疑难解决方法(0)

为什么C#中的CRC32实现如此之慢?

我正在使用以下函数来计算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;
    }
}
Run Code Online (Sandbox Code Playgroud)

为简洁起见,我遗漏了构建查找表(_crc32Table)的函数.该表是一个UInt32数组,是在实例化类时构建的,包含256个值(256也是_LOOKUP_TABLE_MAX_INDEX + 1的值).

我已经运行了一些基准测试,将它与MD5CryptoServiceProvider和SHA1CryptoServiceProvider ComputeHash函数进行比较,它们的速度要快得多.MD5功能的速度提高了两倍,SHA1哈希的速度提高了约35%.我被告知CRC32很快,但那不是我所看到的.

我错误地假设了吗?这是预期的还是这个算法有缺陷?

.net c# crc32

4
推荐指数
2
解决办法
7559
查看次数

标签 统计

.net ×1

c# ×1

crc32 ×1