Вопрос

Я ищу реализацию 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++» на веб-сайте доктора Доббса.

http://drdobbs.com/184403658?pgno=3

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top