無償またはパブリックドメインとして明示的にライセンスされているCまたはC++でのCRC32の実装を探しています。実装 here は素晴らしいように見えますが、ライセンスについて述べている唯一のことは「ソースコード」であり、これは十分ではありません。 LGPL以外を好むので、DLL(私のアプリはクローズドソース))でだまされる必要はありません。zlibでadler32実装を見ましたが、小さなチャンクをチェックしていますアドラーが苦手とするデータ。
Boost C++ライブラリ を使用します。 [〜#〜] crc [〜#〜] が含まれており、 ライセンス が適切です。
SNIPPETS 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は死んだようです。幸いなことに、 Wayback Machine はアーカイブされています。)
コードをコンパイルできるようにするには、BYTE
に符号なし8ビット整数として、DWORD
に符号なし32ビット整数としてtypedefをヘッダーとともに追加する必要があります。ファイル crc.h & sniptype.h .
ヘッダーの唯一の重要な項目はこのマクロです(CRC_32.c自体にも簡単に追加できます:
#define UPDC32(octet, crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
私は、指定されたリンクのソースコードの作成者です。ソースコードライセンスの意図は明確ではありませんが(本日中に公開されます)、実際にはコードは公開されており、文字列が添付されていない無料または商用アプリケーションで使用できます。
Zlib(http://zlib.net/)のcrcコードは最速のものの1つであり、非常に寛大なオープンソースライセンスを持っています。
また、エラー検出パフォーマンスよりも速度が重要な特別なアプリケーションを除き、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 C CRCコードを生成するスクリプトで、選択するオプションがありますCRCサイズ、アルゴリズム、およびモデル。
MITライセンスの下でリリースされています。あなたの目的には受け入れられますか?
私が見つけた最も簡単でわかりやすいC/C++実装は、このページの下部にあるリンクにあります。
Webページ: http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code
コードダウンロードリンク: https://barrgroup.com/code/crc.Zip
これは、1つの.hファイルと1つの.cファイルを持つ単純なスタンドアロン実装です。 defineの使用により、CRC32、CRC16、およびCRC_CCITTがサポートされます。また、コードにより、CRC多項式、初期/最終XOR値、および必要に応じて反射オプション)などのパラメーター設定をユーザーが変更できます。
ライセンスは、LGPLまたは同様のものとして明示的に定義されていません。ただし、このサイトでは、コードをあらゆる用途のためにパブリックドメインに配置していると述べています。実際のコードファイルもこれを言っています。
それが役に立てば幸い!
mhashライブラリー は、私にとってはかなりうまく機能します。十分に高速で、複数のタイプのハッシュ(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
SMHasherのrurbanのフォーク (元のSMHasherは放棄されたようです)は、ハードウェアCRC32をサポートしています。変更は最初のコミットの前に追加されましたが、 新しいCMakeLists.txt と 古いもの (これはSSE =まったく)。
最適なオプションは、おそらく PCLMULQDQをサポートするIntelのzlibフォークこのペーパー で説明されています。このライブラリ SSE 4.2最適化 もあります。
移植性が不要でLinuxを使用している場合は、カーネルの実装(使用可能な場合はハードウェアアクセラレーションを使用)を使用できます。 https://stackoverflow.com/a/11156040/30948