Pregunta

Estoy buscando una implementación de CRC32 en C o C ++ que tenga licencia explícita como gratuita o de dominio público. La implementación aquí parece agradable, pero lo único que dice sobre la licencia es " fuente código " ;, que no es lo suficientemente bueno. Prefiero no LGPL para no tener que perder el tiempo con una DLL (mi aplicación es de código cerrado). Vi la implementación de adler32 en zlib, pero estoy comprobando pequeños fragmentos de datos, para los cuales adler no es bueno.

¿Fue útil?

Solución

Utilice las bibliotecas Boost C ++ . Hay un CRC incluido allí y el la licencia es buena.

Otros consejos

El SNIPPETS C Archivo de código fuente ha una implementación 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, la Wayback Machine lo ha archivado .)

Para poder compilar el código, necesitará agregar typedefs para BYTE como un entero de 8 bits sin signo y DWORD como un 32- sin signo bit entero, junto con los archivos de encabezado crc.h & amp; sniptype.h .

El único elemento crítico en el encabezado es esta macro (que podría ir fácilmente en CRC_32.c:

#define UPDC32(octet, crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))

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 condiciones.

El código crc en zlib (http://zlib.net/) se encuentra entre los más rápidos que existen 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.

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

pycrc es un script de Python que genera código C CRC, con opciones para seleccionar el tamaño, algoritmo y modelo de CRC.

Está publicado bajo la licencia MIT. ¿Es eso aceptable para tus propósitos?

La implementación de C / C ++ más simple y directa que encontré está en un enlace al final 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 simple e independiente con un archivo .h y un archivo .c. Hay soporte para CRC32, CRC16 y CRC_CCITT a través del uso de una definición. Además, el código permite al usuario cambiar la configuración de 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 para 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ódigo reales también dicen esto.

¡Espero que ayude!

La biblioteca mhash funciona bastante bien para mí. Es lo suficientemente rápido, admite múltiples tipos de hashing (crc32, MD5, SHA-1, HAVAL, RIPEMD128, RIPEMD160, TIGER, GOST, etc.). Para obtener CRC32 de una cadena, debe hacer 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

la bifurcación rurban de SMHasher (el SMHasher original parece abandonado) tiene soporte de hardware CRC32. Los cambios se agregaron antes de la confirmación inicial, pero intente comparar los nuevos CMa. txt y el anterior ( que no menciona SSE en absoluto).

La mejor opción es probablemente bifurcación zlib de Intel con soporte PCLMULQDQ descrita en este documento . Esta biblioteca también tiene las optimizaciones SSE 4.2 p . >

Si no necesita portabilidad y está en Linux, puede usar la implementación del núcleo (que está acelerada por hardware si está disponible): https://stackoverflow.com/a/11156040/309483

Me encontré con este útil artículo sobre el cálculo de la suma de verificación.

" Cálculo de sumas de verificación CRC en C ++ " en el sitio web Dr.dobbs.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top