Я использую следующие функции для вычисления CRC32 файла в VS2008, .NET 3.5 проекта:Почему эта реализация CRC32 на C# настолько медленная?
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 работает быстро, но это не то, что я вижу.
Я ошибаюсь в своих предположениях? Этого можно ожидать или есть недостаток в этом алгоритме?
Профиль вашей реализации, найдите горячую точку, и вы узнаете, где это стоит. Все остальное гадает. –
Хороший совет в целом, но это алгоритм CRC32. точка доступа будет все бит-манипуляции. (Да, я угадываю, но готов сделать ставку довольно большой, чтобы я был прав!) Вопрос в том, есть ли оптимизированная реализация алгоритма CRC32, который мог бы работать быстрее? – Cheeso
@Cheeso «Да, я предполагаю, но готов поспорить, что я прав!»: Http://stackoverflow.com/questions/888224/what-is-your-longest-held-programming-assumption -что должно быть неверно/888766 # 888766 – lothar