Я ищу реализацию CRC32 на C или C++, которая явно лицензирована как бесплатная или общедоступная. Реализация here кажется приятной, но единственное, что она говорит о лицензии, это «исходный код», что недостаточно. Я бы предпочел не LGPL, поэтому мне не нужно обманывать DLL (мое приложение закрыто). Я видел реализацию adler32 в zlib, но я проверяю небольшие фрагменты данных, для которых адлер не подходит.Реализация CRC32 C или C++
ответ
Используйте Boost C++ libraries. Там есть CRC, и license хорош.
Использование boost имеет смысл, если вы уже используете библиотеки boost. В противном случае это похоже на стрельбу с птицей-каноном - что-то, что вы определенно можете сделать, но не имеет никакого смысла это делать. – TarmoPikaro 2015-12-26 21:07:48
SNIPPETS C Source Code Archive имеет CRC32 implementation, который свободно использоваться: (.. К сожалению, c.snippets.org, кажется, умер К счастью, Wayback Machine имеет он в архиве)
/* Copyright (C) 1986 Gary S. Brown. You may use this program, or
code or tables extracted from it, as desired without restriction.*/
Для того, чтобы чтобы скомпилировать код, вам нужно будет добавить typedefs для BYTE
как 8-битовое целое без знака и DWORD
как 32-битное целое без знака, а также заголовочные файлы crc.h & sniptype.h.
Единственный критический элемент в заголовке этот макрос (который мог бы так же легко идти в самой CRC_32.c:.
#define UPDC32(octet, crc) (crc_32_tab[((crc)^(octet)) & 0xff]^((crc) >> 8))
Я являюсь автором исходного кода в указанной ссылке Хотя намерение лицензии на исходный код не ясны (это будет позже сегодня), код фактически открыт и свободен для использования в ваших бесплатных или коммерческих приложениях без каких-либо привязок.
- это скрипт Python, который генерирует C CRC код, с опциями для выбора размера, алгоритма и модели CRC.
Он выпущен под лицензией MIT. Это приемлемо для ваших целей?
mhash library работает очень хорошо для меня. Он достаточно быстрый, поддерживает несколько типов хеширования (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
Я столкнулся с этой полезной статьей по расчету контрольных сумм.
«Расчет контрольных сумм CRC на C++» на веб-сайте Dr.dobbs.
КПР код в Zlib (http://zlib.net/) является одним из самых быстрых есть, и имеет очень либеральную лицензию с открытым исходным кодом.
И вы не должны использовать adler-32, за исключением специальных приложений, где скорость важнее, чем производительность обнаружения ошибок.
rurban's fork of SMHasher (оригинальный SMHasher кажется заброшенным) имеет аппаратную поддержку CRC32. Изменения были добавлены до первоначальной фиксации, но попробуйте сравнить the new CMakeLists.txt и the old one (в которых вообще не упоминается SSE).
Лучшим вариантом является, вероятно, Intel's zlib fork with PCLMULQDQ support, описанный в this paper.Эта библиотека also has the SSE 4.2 optimizations.
Если вам не нужна портативность, и вы на Linux, вы можете использовать реализацию этого ядра (что аппаратное ускорение, если таковые имеются): https://stackoverflow.com/a/11156040/309483
использованием 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);
самый простой и прямой реализации, что я нашел в ссылке в нижней части этой страницы:
веб-страница: 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 или аналогичная. Однако сайт говорит, что они размещают код в общедоступном домене для любого использования. Об этом говорят и фактические файлы кода.
Надеюсь, это поможет!
Почему, по вашему мнению, adler32 не подходит для небольших кусков? – wnoise 2008-11-19 19:16:16
http://www.zlib.net/zlib_tech.html «Итак, если Adler-32 используется значительно меньше, чем примерно килобайт, он будет заметно слабее, чем CRC-32 на том же маленьком блоке» – twk 2008-11-20 00:56:41
Вы уже принял его, но если вы хотите, я могу, вероятно, извлечь для вас тот, который они используют в ядре linux довольно легко. – 2011-07-28 18:19:13