再訪、2014 年 8 月最近のコメントでArnaud Bouchez
によって促され、他の回答やコメントを考慮して、元の回答を変更する必要があること、または最も限定的なものであることを認めます。参考までに原文を最後にそのまま残しておきます。
まず、おそらく最も重要なことですが、質問に対する公正な答えは、ハッシュ コードの使用目的によって異なります。「良い」[ハッシュ関数...] とはどういう意味ですか? ハッシュはどこで/どのように使用されますか? (例えば、比較的短い入力キーをハッシュするためですか? インデックス作成/検索目的、メッセージ ダイジェストを生成するため、またはその他の用途のためですか? 目的のハッシュ コード自体、[CRC32 またはその派生物の] すべての 32 ビットの長さ、詳細ビット、より少ない...など?
OPの質問は、「より高速 な汎用ハッシュ関数"、したがって、焦点は SPEED (CPU の負荷が少ないもの、および/またはさまざまな性質の並列処理を利用できるもの) です。ここで、ハッシュ コード自体の計算時間は、多くの場合、問題の一部にすぎないことに注意してください。ハッシュの適用 (たとえば、ハッシュ コードのサイズまたはその固有の特性により、余分なサイクルを処理する必要がある多くの衝突が発生する場合) また、「汎用」の要件により、可能な用途について多くの疑問が残ります。
これを念頭に置いて、短くてより良い答えはおそらく次のとおりです。
はい、新しい Intel プロセッサでの CRC32C のハードウェア実装を使用して、より高速なハッシュ コードを構築できます。ただし、ハッシュの特定の実装とそのアプリケーションによっては、衝突の頻度やより長いコードを使用する必要があるため、全体的な結果が最適ではない可能性があることに注意してください。また、CRC32 アルゴリズム自体はこの点で非常に弱いため、ハッシュの暗号化の使用は慎重に検討する必要があります。
元の回答は、Bret Mulvey による Evaluating Hash functions に関する記事を引用しており、Mdlg の回答で指摘されているように、この記事の結論は、CRC32の実装にバグがあり/欠陥があったため、CRC32 に関して誤りです。CRC32 に関するこの重大なエラーにもかかわらず、この記事は一般的なハッシュ アルゴリズムのプロパティに関する有用なガイダンスを提供します。この記事への URL は現在無効になっています。archive.todayで見つけましたが、作者が別の場所に持っているかどうか、また更新したかどうかはわかりません。
ここでの他の回答は、CRC32Cを使用するハッシュライブラリの例としてCityHash 1.0を引用しています。明らかに、これはいくつかの長い (32 ビットよりも長い) ハッシュ コードのコンテキストで使用されますが、CityHash32() 関数自体には使用されません。また、シティ ハッシュ関数による CRC32 の使用は、ハッシュ コードを生成するために実行されるすべてのシフト、シャッフル、およびその他の操作と比較して、比較的少ないものです。(これは私が実地経験のない CityHash に対する批判ではありません。CityHash 関数が生成するソース コードのざっとしたレビューから、CityHash 関数は適切な分散コードなどを生成しますが、それほど高速ではありません。他のさまざまなハッシュ関数よりも。)
最後に、 SO の疑似重複質問でこの問題に関する洞察を見つけることもできます。
元の回答と編集 (2010 年 4 月)
アプリオリに、これは悪い考えのように聞こえます! .
CRC32 はハッシュ目的で設計されておらず、その分布は均一ではない可能性が高いため、比較的貧弱なハッシュ コードになっています。さらに、その「スクランブリング」能力は比較的弱く、暗号化アプリケーションで使用されるような非常に貧弱な一方向ハッシュになります。
[BRB: その効果に関するオンライン リファレンスを探しています...]
Google の最初の [キーワード = CRC32 分布] ヒットは、これを確認しているようです:
Evaluating CRC32 for hash tables
編集:上記のページ、および実際には完全な記事は、ハッシュ関数で何を探すべきかの良い基礎を提供します。この記事を[すばやく]読んで、一般的にCRC32をハッシュとして使用すべきではない
という包括的な声明を確認しましたが、ハッシュの特定の目的によっては、少なくとも部分的にCRC32をハッシュコード。
たとえば、CRC32 コードの下位 (または実装によっては上位) の 16 ビットは、比較的均等に分布しており、ハッシュ コードの暗号化特性 (つまり、類似のキーが非常によく似たコードを生成する)、たとえば、元のキーの 2 つの半分 (または任意の分割) で生成された 2 つの CRC32 コードの下位 [または上位] 16 ビットの連結を使用するハッシュ コードを構築できる場合があります。
組み込みの CRC32 命令の効率が、代替ハッシュ関数と比較して、命令を 2 回呼び出してコードをつなぎ合わせるなどのオーバーヘッドが発生しないようなものであるかどうかを確認するために、テストを実行する必要があります。全体的に遅い機能。