![](https://habrastorage.org/webt/h0/qm/o_/h0qmo_7y3rhvlvecjmsspmsj7c0.png)
Core 2 Duo 3.0 GHzのプログラムSMHasherで作成されたベンチマーク
Habréで、 非暗号化ハッシュ関数について繰り返し語りました。これは、 暗号化ハッシュ関数よりも桁違いに高速です。 速度が重要な場合に使用され、遅いMD5またはSHA1を使用する意味はありません。 たとえば、キーと値のペアのストレージを使用してハッシュテーブルを構築したり、大きなファイルを転送するときにチェックサムをすばやくチェックしたりします。
最も人気のあるものの1つは、約5年前に登場したxxHashハッシュ関数ファミリーです。 最初、これらのハッシュはLZ4圧縮中にチェックサムを検証するために考案されましたが、さまざまなタスクで使用されるようになりました。 xxHashと他のいくつかのハッシュ関数のパフォーマンスの比較で上の表を見てください。 このテストでは、xxHashのパフォーマンスが最も近い競合製品の半分を超えています。 XXH3の新しいバージョンは、 水準をさらに引き上げます。
![](https://habrastorage.org/webt/p_/we/gx/p_wegxj3siry851kiu6bd6qsqog.png)
以下、チャートはクリック可能です
プログラム作成者のYann Collet は 、アルゴリズムを改善するというアイデアは、小さな可変長入力データに基づいて64の擬似ランダムビットを迅速に生成する必要があるブルームフィルターの実装中に生まれたと書いています。 原則として、標準のXXH64はこれを処理できますが、小さな入力データの処理は開発の優先事項ではありませんでした。 つまり、最適化が可能です。 この最適化の結果、新しいXXH3ハッシュ関数が登場しました。この関数には、他のハッシュアルゴリズムのアイデアが実装されています。 最も興味深いことに、XXH3は既存のすべてのxxHashバリアントよりも大幅に高速であり、小さな入力データだけでなく、ほとんどすべてのユースケースで使用できます。
XXH3は、XXH64の主な欠点である64ビットのハッシュ制限を排除します。 著者は、このために少なくとも128ビットバージョンをリリースするようにしばしば求められたと言います。 したがって、XXH3ハッシュ関数は、理論的には最大256ビットのハッシュを生成できます。
XXH3で、ベクトル化によって最適に処理される内部ループ。 このため、関数は命令セットSSE2、AVX2、およびNEONでハードウェアサポートを使用します。 パフォーマンスはコンパイラに依存します。 意外なことに、clangによってコンパイルされたバージョンは、他のバージョンよりもはるかに優れています。 Jan Colleは、ここでのハッシュ関数のパフォーマンスがメモリ帯域幅を超えると考えていました。 グラフ上のこのバージョンは破線に対応しています。
![](https://habrastorage.org/webt/tq/9x/80/tq9x80gkeyybxgr6ui4gpga1e50.png)
その結果、AVX2をサポートするハッシュ関数のスループットはRAMよりもはるかに高いため、キャッシュサイズが重要な要素になることが判明しました。 ただし、多くのタスクでは、すでにキャッシュにあるデータを処理する必要があるため、メモリよりも速い速度で作業するのが理にかなっています。
SSE2命令のサポートにより、新しいハッシュ関数は、現実世界でまだ一般的な32ビットアプリケーション(たとえば、WASMバイトコード)でXXH32を大幅に回避できます。
![](https://habrastorage.org/webt/1s/mu/bk/1smubkchlywttvoz3funjxgu9po.png)
小さい入力データ(20〜30バイト)では、XXH3ハッシュ関数はそれほど多くはありませんが、GoogleのCityHashや、以前は明確なリーダーだったFarmHashよりも優れています。
![](https://habrastorage.org/webt/ug/ca/he/ugcahetdr0kfsm5bkydlwgezaow.png)
次のグラフは、可変長(1〜Nのランダム変数)の入力データを使用した最も現実的なテストの結果を示しています。
![](https://habrastorage.org/webt/pu/ry/cb/purycbxasjuqmaz1vmgk9b5sqr8.png)
別のテストでは、 遅延が考慮されます。ここでは、信号でハッシュが開始されます。 アイデアは、ハッシュ関数が継続的に機能せず、特定の瞬間に他のプロセスで呼び出される実際のワークロードをシミュレートすることです。
![](https://habrastorage.org/webt/a5/vd/sj/a5vdsjlkavxgcsxmchixqe_igfs.png)
著者は、64×64 => 128ビットの乗算によるこのテストは、Vladimir Makarovのmumv2アルゴリズムとLeo Yuryevのt1ha2アルゴリズムを好むと書いています。
![](https://habrastorage.org/webt/rp/8c/vs/rp8cvsrlhdkdvemb6dbvculzzgq.png)
最後に、遅延を考慮した可変長の入力データのハッシュレートを示す最後の最も重要なグラフを示します。 これは、データベースなどでのハッシュ関数の実際の使用を反映しています。
![](https://habrastorage.org/webt/cy/ut/ec/cyutecynmtdmcvtzskuwntmbah4.png)
XXH3はxxHash v0.7.0パッケージの一部としてリリースされました。 「実験的」というマークが付いています。ロックを解除するには、マクロ
XXH_STATIC_LINKING_ONLY
を使用する必要があります。 著者は、これまでのハッシュ関数はテストの一時データでのみ使用でき、ハッシュの実際の保存には使用できないと説明しています。 実験期間の結果とユーザーレビューのコレクションによると、XXH3関数はxxHashの次のバージョンで安定したステータスを受け取ります。
![](https://habrastorage.org/webt/sd/gx/mb/sdgxmb5twkoan_ng2j_s_h5qpkc.png)
GlobalSignは、 信頼できるデジタル署名を実装するための幅広い機能を提供します 。 デスクトップ、サーバーからクラウド実装まで。 詳細