57

私は C または C++ での CRC32 の実装を探しています。これは、明示的に無償またはパブリック ドメインとしてライセンスされています。ここでの実装は良さそうに見えますが、ライセンスについて書かれているのは「ソース コード」だけで、十分ではありません。私は非 LGPL を好むので、DLL をいじる必要はありません (私のアプリはクローズド ソースです)。zlib で adler32 の実装を見ましたが、adler が適していないデータの小さなチャンクをチェックしています。

4

9 に答える 9

39

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))
于 2008-11-19T19:16:30.593 に答える
31

私は、指定されたリンクのソース コードの作成者です。ソース コード ライセンスの意図は明確ではありませんが (今日中に公開される予定です)、コードは実際にはオープンであり、無料または商用のアプリケーションで文字列を付けずに自由に使用できます。

于 2009-02-03T13:26:35.880 に答える
27

Boost C++ ライブラリを使用します。そこにはCRCが含まれており、ライセンスは良好です。

于 2008-11-19T18:47:21.917 に答える
18

zlib(http://zlib.net/)のcrcコードは、最も高速なものの1つであり、非常にリベラルなオープンソースライセンスを持っています。

また、エラー検出のパフォーマンスよりも速度が重要な特別なアプリケーションを除いて、adler-32を使用しないでください。

于 2012-02-21T05:33:40.473 に答える
16

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);
于 2014-07-29T15:08:23.933 に答える
5

pycrcは、CRCサイズ、アルゴリズム、モデルを選択するオプションを備えたCCRCコードを生成するPythonスクリプトです。

MITライセンスの下でリリースされています。それはあなたの目的に受け入れられますか?

于 2009-10-05T11:28:37.847 に答える
5

私が見つけた最も単純でわかりやすい 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 などで明示的に定義されていません。ただし、このサイトは、コードをパブリックドメインに置いて使用していると言っています. 実際のコード ファイルもこれを示しています。

それが役に立てば幸い!

于 2016-01-25T19:34:03.400 に答える
4

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
于 2011-01-03T20:33:49.170 に答える
1

rurban の SMHasher のフォーク(元の SMHasher は放棄されたようです) は、ハードウェア CRC32 をサポートしています。変更は最初のコミットの前に追加されましたが、新しい CMakeLists.txt古いもの(SSE についてはまったく言及されていません) を比較してみてください。

最良の選択肢はおそらく、この論文で説明されているPCLMULQDQ サポートを備えた Intel の zlib フォークです。このライブラリには、SSE 4.2 の最適化も含まれています。

移植性が必要なく、Linux を使用している場合は、カーネルの実装 (利用可能な場合はハードウェア アクセラレーション) を使用できます: https://stackoverflow.com/a/11156040/309483

于 2014-04-25T18:53:33.097 に答える