boost::hash_combine が C でハッシュ値を結合する最良の方法ではないのはなぜですか?

DDD
リリース: 2024-11-10 15:50:03
オリジナル
805 人が閲覧しました

Why is boost::hash_combine Not the Best Way to Combine Hash Values in C  ?

C でハッシュ値を結合する最良の方法 : boost::hash_combine の謎を解く

C の世界では、 boost::hash_combine はよくハッシュ値を組み合わせる最適な方法として宣伝されています。ここで疑問が生じます: なぜこれが最良のアプローチなのでしょうか?

boost::hash_combine について

boost::hash_combine 関数は 2 つの引数を取ります: シード値とハッシュされる値。次に、一連のビット操作を使用して値を結合し、前のハッシュのエントロピーを組み込んだ新しいシードを生成します。

template <class T>
inline void hash_combine(std::size_t& seed, const T& v)
{
    std::hash<T> hasher;
    seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
ログイン後にコピー

なぜそれが最適ではないのですか?

驚くべきことに、boost::hash_combine は思ったほど最適ではありません

  1. 分散が悪い: std::hash のような分散が不十分なハッシュ関数と組み合わせて使用​​すると、boost::hash_combine は高い衝突率を示す可能性があります。
  2. エントロピー損失: すべてのエントロピーがシードに集中している場合、一部のエントロピーは

より良い代替

代替ハッシュ結合関数は、適切な分散とエントロピー保存の両方を提供できます。

template <class T>
inline size_t hash_combine(std::size_t& seed, const T& v)
{
    return rotl(seed, std::numeric_limits<size_t>::digits/3) ^ distribute(std::hash<T>{}(v));
}
ログイン後にコピー

この機能利用:

  • ビットローテーション: ハッシュ計算順序を適切にするためにシードを回転します。
  • 適切な分散: カスタム分散を使用します。より良いハッシュ分散のための関数。
  • を保持します。 Entropy: エントロピーの損失を防ぐために結合する前にシードをローテーションします。

パフォーマンスに関する考慮事項

boost::hash_combine は高速ですが、代替関数は犠牲を払います。ハッシュ品質を向上させるためにある程度の速度が必要です。ただし、この速度のトレードオフは、ほとんどのアプリケーションでは一般に無視できます。

以上がboost::hash_combine が C でハッシュ値を結合する最良の方法ではないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート