2008-11-19 2 views
50

Я ищу реализацию CRC32 на C или C++, которая явно лицензирована как бесплатная или общедоступная. Реализация here кажется приятной, но единственное, что она говорит о лицензии, это «исходный код», что недостаточно. Я бы предпочел не LGPL, поэтому мне не нужно обманывать DLL (мое приложение закрыто). Я видел реализацию adler32 в zlib, но я проверяю небольшие фрагменты данных, для которых адлер не подходит.Реализация CRC32 C или C++

+0

Почему, по вашему мнению, adler32 не подходит для небольших кусков? – wnoise 2008-11-19 19:16:16

+3

http://www.zlib.net/zlib_tech.html «Итак, если Adler-32 используется значительно меньше, чем примерно килобайт, он будет заметно слабее, чем CRC-32 на том же маленьком блоке» – twk 2008-11-20 00:56:41

+1

Вы уже принял его, но если вы хотите, я могу, вероятно, извлечь для вас тот, который они используют в ядре linux довольно легко. – 2011-07-28 18:19:13

ответ

24

Используйте Boost C++ libraries. Там есть CRC, и license хорош.

+12

Использование boost имеет смысл, если вы уже используете библиотеки boost. В противном случае это похоже на стрельбу с птицей-каноном - что-то, что вы определенно можете сделать, но не имеет никакого смысла это делать. – TarmoPikaro 2015-12-26 21:07:48

31

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)) 
23

Я являюсь автором исходного кода в указанной ссылке Хотя намерение лицензии на исходный код не ясны (это будет позже сегодня), код фактически открыт и свободен для использования в ваших бесплатных или коммерческих приложениях без каких-либо привязок.

5

- это скрипт Python, который генерирует C CRC код, с опциями для выбора размера, алгоритма и модели CRC.

Он выпущен под лицензией MIT. Это приемлемо для ваших целей?

2

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 
15

КПР код в Zlib (http://zlib.net/) является одним из самых быстрых есть, и имеет очень либеральную лицензию с открытым исходным кодом.

И вы не должны использовать adler-32, за исключением специальных приложений, где скорость важнее, чем производительность обнаружения ошибок.

1

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

4

самый простой и прямой реализации, что я нашел в ссылке в нижней части этой страницы:

веб-страница: 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 или аналогичная. Однако сайт говорит, что они размещают код в общедоступном домене для любого использования. Об этом говорят и фактические файлы кода.

Надеюсь, это поможет!