私は C または C++ での CRC32 の実装を探しています。これは、明示的に無償またはパブリック ドメインとしてライセンスされています。ここでの実装は良さそうに見えますが、ライセンスについて書かれているのは「ソース コード」だけで、十分ではありません。私は非 LGPL を好むので、DLL をいじる必要はありません (私のアプリはクローズド ソースです)。zlib で adler32 の実装を見ましたが、adler が適していないデータの小さなチャンクをチェックしています。
9 に答える
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にはアーカイブされています。)
コードをコンパイルできるようにするには、ヘッダーファイルcrc.hおよびsniptype.hとともに、BYTE
符号なし8ビット整数および符号なし32ビット整数としてのtypedefを追加する必要があります。DWORD
ヘッダーの唯一の重要な項目は、このマクロです(CRC_32.c自体にも同じように簡単に入れることができます。
#define UPDC32(octet, crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
私は、指定されたリンクのソース コードの作成者です。ソース コード ライセンスの意図は明確ではありませんが (今日中に公開される予定です)、コードは実際にはオープンであり、無料または商用のアプリケーションで文字列を付けずに自由に使用できます。
Boost C++ ライブラリを使用します。そこにはCRCが含まれており、ライセンスは良好です。
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は、CRCサイズ、アルゴリズム、モデルを選択するオプションを備えたCCRCコードを生成するPythonスクリプトです。
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 ファイルによる単純なスタンドアロンの実装です。定義を使用することで、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
rurban の SMHasher のフォーク(元の SMHasher は放棄されたようです) は、ハードウェア CRC32 をサポートしています。変更は最初のコミットの前に追加されましたが、新しい CMakeLists.txtと古いもの(SSE についてはまったく言及されていません) を比較してみてください。
最良の選択肢はおそらく、この論文で説明されているPCLMULQDQ サポートを備えた Intel の zlib フォークです。このライブラリには、SSE 4.2 の最適化も含まれています。
移植性が必要なく、Linux を使用している場合は、カーネルの実装 (利用可能な場合はハードウェア アクセラレーション) を使用できます: https://stackoverflow.com/a/11156040/309483