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 は思ったほど最適ではありません
より良い代替
代替ハッシュ結合関数は、適切な分散とエントロピー保存の両方を提供できます。
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)); }
この機能利用:
パフォーマンスに関する考慮事項
boost::hash_combine は高速ですが、代替関数は犠牲を払います。ハッシュ品質を向上させるためにある程度の速度が必要です。ただし、この速度のトレードオフは、ほとんどのアプリケーションでは一般に無視できます。
以上がboost::hash_combine が C でハッシュ値を結合する最良の方法ではないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。