0

私はハッシュ全般とSTLの世界に不慣れで、新しいstd::unrdered_setと SGI :hash_set を見ました。どちらもhasher hashを使用しています。適切な負荷係数を得るには、独自のハッシュ関数を作成する必要があるかもしれませんが、それを作成できました。

ただし、元のデフォルトの has_functions がどのように記述されているかを深く掘り下げようとしています。私の質問は次のとおりです。1) 元のデフォルトの HashFcn はどのように書かれていますか? より具体的には、ハッシュはどのように生成されますか? 擬似乱数に基づいていますか。誰かが私にいくつかのヘッダーファイルを教えてもらえますか(ドキュメントで少し迷っています)、そこで調べることができます; ハッシャーハッシュの実装方法。

2) 毎回同じキーを取得できることをどのように保証しますか?

質問をより明確にすることができるかどうか教えてください。

4

2 に答える 2

0

ここでたまたまインストールした gcc のバージョンでは、必要なハッシュ関数は/usr/lib/gcc/i686-pc-cygwin/4.7.3/include/c++/bits/functional_hash.h

整数型のハッシュは、マクロを使用して定義され_Cxx_hashtable_define_trivial_hashます。名前から想像できるように、これは入力値を にキャストするだけsize_tです。

これがgccのやり方です。gcc を使用している場合は、同様の名前のファイルがどこかにあるはずです。別のコンパイラを使用している場合、ソースは別の場所にあります。すべての実装で整数型に自明なハッシュを使用する必要はありませんが、非常に一般的であると思います。

これは乱数ジェネレーターに基づいたものではありません。うまくいけば、この関数が毎回同じ入力に対して同じキーを返すことを保証する方法が明らかになったことを願っています! 自明なハッシュを使用する理由は、可能な限り高速であるためです。データの分布が悪い場合 (値がバケット数を法として衝突する傾向があるため)、別の遅いハッシュ関数を使用するか、別の数のバケットを使用できます (std::unordered_set正確な数を指定することはできません)。バケットですが、最小値を設定できます)。ライブラリの実装者はあなたのデータについて何も知らないので、遅いハッシュ関数をデフォルトとして導入しない傾向があると思います。

于 2013-08-17T10:29:05.597 に答える