boost::hash_combine 関数は、ハッシュ値を結合する効率的な方法として高く評価されています。ただし、その優位性は速度だけではありません。また、エントロピーの強化された混合と保存も提供します。
この関数は、以下のコード スニペットに示されているように、内部ハッシュ関数 xor-shifts の組み合わせを利用します。 、およびマジックナンバー (0x9e3779b9):
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 の元の実装は分散の観点から最適ではありませんでした。 std::hash のような分散が不十分なハッシュ関数と組み合わせて使用すると、多数の衝突が発生する可能性があります。
改訂されたブースト::バージョン 1.81 の 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)); }
この修正されたアルゴリズムでは、複数の XOR シフトと回転演算を使用して優れた混合を実現し、結果として次のようになります。
boost::hash_combine は依然として迅速なオプションですが、改訂された代替アルゴリズムでは、複数の XOR シフトと回転操作を実装することにより、混合とエントロピーの保存が強化されています。大規模なハッシュを必要とするアプリケーションの場合、衝突の数が減り、分散が改善されるため、より信頼性の高い選択肢となります。
以上がboost::hash_combine はハッシュ値を結合するための理想的なソリューションですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。