103

boost::hash_combineテンプレート関数は、ハッシュ(と呼ばれるseed)とオブジェクトへの参照を取りますvドキュメントによると、それはによってseedのハッシュと結合しますv

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);

これは決定論的であることがわかります。XORが使用される理由がわかります。

この追加は、類似した値を大きく離れてマッピングするのに役立つので、ハッシュテーブルのプロービングが機能しなくなることはないと思いますが、誰かが魔法の定数とは何かを説明できますか?

4

2 に答える 2

154

マジックナンバーは32個のランダムビットであると想定されており、それぞれが0または1である可能性が等しく、ビット間に単純な相関関係はありません。このようなビットの文字列を見つける一般的な方法は、無理数の2進展開を使用することです。この場合、その数は黄金比の逆数です。

phi = (1 + sqrt(5)) / 2
2^32 / phi = 0x9e3779b9

したがって、この数値を含めると、シードの各ビットが「ランダムに」変更されます。あなたが言うように、これは連続する値がはるかに離れていることを意味します。古いシードのシフトされたバージョンを含めることで、hash_value()値の範囲がかなり狭い場合でも、違いがすぐにすべてのビットに広がるようになります。

于 2011-02-09T18:32:39.503 に答える
29

1997年のBobJenkinsによるDDJの記事をご覧ください。魔法の定数(「黄金比」)は次のように説明されます。

黄金比は実際には任意の値です。その目的は、すべてのゼロがすべてのゼロにマッピングされないようにすることです。

于 2011-02-09T18:47:34.900 に答える