Реализация CRC32 C или c++ [закрыто]
Я ищу реализацию CRC32 на C или C++, которая явно лицензирована как не стоящая или общедоступная. Реализация здесь кажется хорошим, но единственное, что он говорит о лицензии, это "исходный код", который недостаточно хорош. Я бы предпочел не LGPL, поэтому мне не нужно дурачиться с DLL (мое приложение закрыто). Я видел реализацию adler32 в zlib, но я проверяю небольшие куски данных, для которых adler не подходит.
10 ответов
использовать повысить библиотеки C++. Есть CRC входит и лицензия - это хорошо.
на фрагменты 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 кажется, умер. К счастью,Машина Wayback есть в архивах.)
чтобы скомпилировать код, вам нужно будет добавить typedefs для 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 C, с параметрами для выбора размера CRC, алгоритма и модели.
он выпущен под лицензией MIT. Это приемлемо для ваших целей?
самая простая и простая реализация, которую я нашел, находится в ссылке внизу этой страницы:
Веб-Страница:http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code
Ссылка Для Скачивания Кода:https://barrgroup.com/code/crc.zip
Это простая автономная реализация с одним .ч и одна .файл c. Существует поддержка CRC32, CRC16 и CRC_CCITT через использование define. Кроме того, код позволяет пользователю изменять параметры параметров, такие как полином CRC, начальное/конечное значение XOR и параметры отражения, если вы этого хотите.
лицензия явно не определена ala LGPL или аналогичная. Но сайт говорит, что они ставят код в открытом доступе для любого использования. Фактические файлы кода также говорят об этом.
надеюсь, что это помогает!
на библиотека mhash работает очень хорошо для меня. Он достаточно быстр, поддерживает несколько типов хэширования (crc32, MD5, SHA-1, HAVAL, RIPEMD128, RIPEMD160, TIGER, GOST и т. д.). Чтобы получить 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
rurban из SMHasher (оригинальный SMHasher кажется заброшенным) имеет аппаратную поддержку CRC32. Изменения были добавлены до начальной фиксации, но попробуйте сравнить новые CMakeLists.txt и старый (который вообще не упоминает SSE).
лучший вариант, вероятно,вилка Intel zlib с поддержкой pclmulqdq описано в этой статье. Эта библиотека!--13-->также имеет SSE 4.2 оптимизация.
Если вам не нужна переносимость, и вы находитесь в Linux, вы можете использовать реализацию ядра (которая ускоряется, если доступна):https://stackoverflow.com/a/11156040/309483
я наткнулся на эту полезную статью о расчете контрольной суммы.
"расчет контрольных сумм CRC в C++" на веб-сайте Dr.dobbs.