Implementación de CRC32 C o C++
(10)
Soy el autor del código fuente en el enlace especificado. Si bien la intención de la licencia del código fuente no está clara (será más tarde hoy), el código es, de hecho, abierto y gratuito para su uso en sus aplicaciones gratuitas o comerciales sin ningún compromiso.
Estoy buscando una implementación de CRC32 en C o C ++ que esté explícitamente licenciada como sin costo o dominio público. La implementación aquí parece agradable, pero lo único que dice sobre la licencia es el "código fuente", que no es lo suficientemente bueno. Preferiría no LGPL, así que no tengo que jugar con una DLL (mi aplicación es de código cerrado). Vi la implementación de adler32 en zlib, pero estoy verificando pequeños fragmentos de datos, adler no es bueno para ellos.
pycrc es un script Python que genera código C CRC, con opciones para seleccionar el tamaño CRC, el algoritmo y el modelo.
Se lanzó bajo la licencia de MIT. ¿Es eso aceptable para tus propósitos?
Me encontré con este artículo útil sobre el cálculo de suma de verificación.
"Cálculo de sumas de verificación CRC en C ++" en el sitio web de Dr.dobbs.
La biblioteca mhash funciona bastante bien para mí. Es lo suficientemente rápido, admite múltiples tipos de hash (crc32, MD5, SHA-1, HAVAL, RIPEMD128, RIPEMD160, TIGER, GOST, etc.). Para obtener CRC32 de una cadena, harías algo como esto:
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
El código crc en zlib (http://zlib.net/) está entre los más rápidos que hay, y tiene una licencia de código abierto muy liberal.
Y no debe usar adler-32, excepto para aplicaciones especiales donde la velocidad es más importante que el rendimiento de detección de errores.
Use las bibliotecas de Boost C ++ . Hay un CRC incluido allí y la licencia es buena.
usando 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);
El archivo de código fuente de SNIPPETS C tiene una implementación de CRC32 que se puede usar libremente:
/* Copyright (C) 1986 Gary S. Brown. You may use this program, or
code or tables extracted from it, as desired without restriction.*/
(Desafortunadamente, c.snippets.org parece haber muerto. Afortunadamente, Wayback Machine lo tiene archivado).
Para poder compilar el código, necesitará agregar typedefs para BYTE
como un entero de 8 bits sin signo y DWORD
como un entero de 32 bits sin signo, junto con los archivos de encabezado crc.h & sniptype.h .
El único elemento crítico en el encabezado es esta macro (que podría ir tan fácilmente en CRC_32.c mismo:
#define UPDC32(octet, crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
La implementación más simple y directa que encontré está en un enlace al pie de esta página:
Página web: http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code
Enlace de descarga de código: https://barrgroup.com/code/crc.zip
Es una implementación independiente y simple con un archivo .h y uno .c. Hay soporte para CRC32, CRC16 y CRC_CCITT mediante el uso de una definición. Además, el código permite al usuario cambiar la configuración de los parámetros, como el polinomio CRC, el valor XOR inicial / final y las opciones de reflexión, si así lo desea.
La licencia no está explícitamente definida a LGPL o similar. Sin embargo, el sitio dice que están colocando el código en el dominio público para cualquier uso. Los archivos de códigos reales también dicen esto.
¡Espero eso ayude!
El tenedor de Rurban de SMHasher (el SMHasher original parece abandonado) tiene soporte para hardware CRC32. Los cambios se agregaron antes de la confirmación inicial, pero intente comparar el nuevo CMakeLists.txt y el anterior (que no menciona SSE en absoluto).
La mejor opción es probablemente el fork zlib de Intel con soporte PCLMULQDQ descrito en este documento . Esta biblioteca también tiene las optimizaciones de SSE 4.2 .
Si no necesita portabilidad y está en Linux, puede usar la implementación del kernel (que está acelerada por hardware si está disponible): https://.com/a/11156040/309483