Реализация CRC32 C или C++ [закрыто]
Вопрос
Я ищу реализацию CRC32 на C или C++, которая явно лицензирована как бесплатная или общедоступная.Реализация здесь Вроде бы неплохо, но единственное, что там написано о лицензии, это «исходный код», а это недостаточно хорошо.Я бы предпочел не LGPL, чтобы мне не приходилось возиться с DLL (мое приложение с закрытым исходным кодом).Я видел реализацию adler32 в zlib, но проверяю небольшие фрагменты данных, для чего adler не годится.
Решение
Использовать Увеличить библиотеки C++.Eсть КПР включено туда и лицензия хороший.
Другие советы
А Фрагменты исходного кода C Архив имеет Реализация CRC32 который можно свободно использовать:
/* Copyright (C) 1986 Gary S. Brown. You may use this program, or
code or tables extracted from it, as desired without restriction.*/
(К сожалению, c.snippets.org, похоже, умер.К счастью, Вейбэк-машина есть в архиве.)
Чтобы иметь возможность скомпилировать код, вам необходимо добавить определения типов для BYTE
как беззнаковое 8-битное целое число и DWORD
как беззнаковое 32-битное целое число вместе с файлами заголовков crc.h & sniptype.h.
Единственный критический элемент в заголовке — это этот макрос (который с таким же успехом можно было бы включить в сам CRC_32.c:
#define UPDC32(octet, crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
Я являюсь автором исходного кода по указанной ссылке.Хотя назначение лицензии на исходный код неясно (это будет позже сегодня), на самом деле код открыт и бесплатен для использования в ваших бесплатных или коммерческих приложениях без каких-либо условий.
Код crc в zlib (http://zlib.net/) является одним из самых быстрых и имеет очень либеральную лицензию с открытым исходным кодом.
И вам не следует использовать adler-32, за исключением специальных приложений, где скорость важнее производительности обнаружения ошибок.
используя zlib.h (http://refspecs.linuxbase.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/zlib-crc32-1.html):
#include <zlib.h>
unsigned long crc = crc32(0L, Z_NULL, 0);
crc = crc32(crc, (const unsigned char*)data_address, data_len);
pycrc — это скрипт Python, который генерирует код CRC CRC с возможностью выбора размера, алгоритма и модели CRC.
Он выпущен под лицензией MIT.Это приемлемо для ваших целей?
Самая простая и понятная реализация C/C++, которую я нашел, находится по ссылке внизу этой страницы:
Веб-страница: http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code
Ссылка для скачивания кода: https://barrgroup.com/code/crc.zip
Это простая автономная реализация с одним файлом .h и одним файлом .c.Существует поддержка CRC32, CRC16 и CRC_CCITT посредством использования определения.Кроме того, код позволяет пользователю изменять настройки параметров, такие как полином CRC, начальное/конечное значение XOR и параметры отражения, если вы того пожелаете.
Лицензия явно не определена, например LGPL или аналогичная.Однако на сайте говорится, что они размещают код в открытом доступе для любого использования.Фактические файлы кода также говорят об этом.
Надеюсь, поможет!
А библиотека Мхэша у меня работает очень хорошо.Достаточно быстрый, поддерживает несколько типов хеширования (crc32, MD5, SHA-1, HAVAL, RIPEMD128, RIPEMD160, TIGER, ГОСТ и т.д.).Чтобы получить CRC32 строки, вы должны сделать что-то вроде этого:
MHASH td = mhash_init(MHASH_CRC32);
if (td == MHASH_FAILED) return -1; // handle failure
mhash(td, s, strlen(s));
unsigned int digest = 0; // crc32 will be stored here
mhash_deinit(td, &digest);
// do endian swap here if desired
городская вилка SMHasher (оригинальный SMHasher кажется заброшенным) имеет аппаратную поддержку CRC32.Изменения были добавлены до первоначальной фиксации, но попробуйте сравнить новый CMakeLists.txt и Старый (где вообще не упоминается SSE).
Лучший вариант, пожалуй, Форк Intel zlib с поддержкой PCLMULQDQ описано в Эта бумага.Эта библиотека также имеет оптимизацию SSE 4.2..
Если вам не нужна переносимость и вы используете Linux, вы можете использовать реализацию ядра (которая имеет аппаратное ускорение, если оно доступно): https://stackoverflow.com/a/11156040/309483
Я наткнулся на эту полезную статью о вычислении контрольной суммы.
«Вычисление контрольных сумм CRC на C++» на веб-сайте доктора Доббса.