Je recherche une implémentation de CRC32 en C ou C++ qui est explicitement autorisée comme étant sans frais ou dans le domaine public. L'implémentation ici semble sympa, mais la seule chose qu'il dit à propos de la licence est le "code source", ce qui n'est pas suffisant. Je préférerais non LGPL, donc je n'ai pas à jouer avec un DLL (mon application est une source fermée). J'ai vu l'implémentation adler32 dans zlib, mais je vérifie de petits morceaux de données, ce qui n'est pas bon pour Adler.
Utilisez les Boost C++ bibliothèques . Il y a un CRC inclus et la licence est bonne.
SNIPPETS C Source Code Archive a un implémentation CRC32 librement utilisable:
/* Copyright (C) 1986 Gary S. Brown. You may use this program, or
code or tables extracted from it, as desired without restriction.*/
(Malheureusement, c.snippets.org semble être mort. Heureusement, le Wayback Machine l'a archivé.)
Pour pouvoir compiler le code, vous devrez ajouter des typedefs pour BYTE
comme entier non signé 8 bits et DWORD
comme entier non signé 32 bits, avec l'en-tête fichiers crc.h & sniptype.h .
Le seul élément critique dans l'en-tête est cette macro (qui pourrait tout aussi bien aller dans CRC_32.c lui-même:
#define UPDC32(octet, crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
Je suis l'auteur du code source sur le lien spécifié. Bien que l'intention de la licence de code source ne soit pas claire (ce sera plus tard aujourd'hui), le code est en fait ouvert et gratuit pour une utilisation dans vos applications gratuites ou commerciales sans aucune condition.
Le code crc dans zlib (http://zlib.net/) est parmi les plus rapides qui soient, et possède une licence open source très libérale.
Et vous ne devez pas utiliser adler-32, sauf pour des applications spéciales où la vitesse est plus importante que les performances de détection d'erreurs.
en utilisant 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 est un script Python qui génère du code C CRC, avec des options pour sélectionner le Taille, algorithme et modèle du CRC.
Il est publié sous la licence MIT. Est-ce acceptable pour vos besoins?
L'implémentation C/C++ la plus simple et la plus simple que j'ai trouvée se trouve dans un lien au bas de cette page:
Page Web: http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code
Lien de téléchargement de code: https://barrgroup.com/code/crc.Zip
Il s'agit d'une implémentation autonome simple avec un fichier .h et un fichier .c. Il y a un support pour CRC32, CRC16 et CRC_CCITT à travers l'utilisation d'un define. En outre, le code permet à l'utilisateur de modifier les paramètres comme le polynôme CRC, la valeur initiale/finale XOR et les options de réflexion si vous le souhaitez).
La licence n'est pas explicitement définie ala LGPL ou similaire. Cependant, le site dit qu'ils placent le code dans le domaine public pour toute utilisation. Les fichiers de code réels le disent également.
J'espère que ça aide!
La bibliothèque mhash fonctionne très bien pour moi. Il est assez rapide, prend en charge plusieurs types de hachage (crc32, MD5, SHA-1, HAVAL, RIPEMD128, RIPEMD160, TIGER, GOST, etc.). Pour obtenir le CRC32 d'une chaîne, vous feriez quelque chose comme ceci:
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 fourchette de ruralban de SMHasher (le SMHasher original semble abandonné) a un support matériel CRC32. Les modifications ont été ajoutées avant la validation initiale, mais essayez de comparer le nouveau CMakeLists.txt et l'ancien (qui ne mentionne pas SSE = pas du tout).
La meilleure option est probablement fourche zlib d'Intel avec prise en charge PCLMULQDQ décrite dans ce document . Cette bibliothèque a également les optimisations SSE 4.2 .
Si vous n'avez pas besoin de portabilité et que vous êtes sous Linux, vous pouvez utiliser l'implémentation du noyau (qui est accélérée matériellement si disponible): https://stackoverflow.com/a/11156040/30948
Je suis tombé sur cet article utile sur le calcul des sommes de contrôle.
"Calcul des sommes de contrôle CRC en C++" sur le site Web de Dr.dobbs.