Я использую следующую функцию для вычисления CRC32 файла в проекте VS2008, .NET 3.5:
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 быстрый, но это не то, что я вижу.
Я ошибаюсь в своих предположениях? Это следовало ожидать или в этом алгоритме есть недостаток?