0

一連の整数の hash_set のハッシャーが整数そのものであると判断したとします。また、整数の範囲が非常に大きく、1 ~ 20、次に 1000 ~ 1200、次に 10000 ~ 12000 であるとも言います。例: 1, 2, 5, 7, 1111, 1102, 1000, 10003, 10005 これは非常に悪いハッシュ関数ではないでしょうか? この場合、データは hash_set によってどのように保存されるのでしょうか。誰かが知っていれば、たとえば gcc 実装です。

ありがとう

編集:両方の返信ありがとうございます。入力値を返すようにハッシャーを既に指定していることに注意してください。たとえば、1001 のハッシュは 1001 になります。したがって、実装が別のラウンドのハッシュを自由に実行できるかどうか、または 1001 を参照して配列サイズが 1001 に大きくなるかどうかを尋ねます。

4

2 に答える 2

0

データがハッシュ値内の特定の範囲にまとめられている場合でも、通常、各値のハッシュの最下位ビットのみが格納に使用されます。これは、たとえば 0 ~ 128 を表すビットが均等に分散されている場合、ハッシュ関数はハッシュ値の分散に関係なく適切に動作することを意味します。ただし、これは、値がすべて特定のバイナリ値の倍数、たとえば 8 である場合、下位ビットが均等に分散されず、値がハッシュ テーブルに集まり、過剰な連鎖が発生して操作が遅くなることを意味します。

于 2012-04-24T07:42:06.927 に答える
0

ハッシュテーブルは最初は小さく、負荷率が十分に高くなると再ハッシュして大きくなることがあります。もちろん、ハッシュ値が 12000 であるからといって、12000 個のバケットがあることを意味するわけではありません。hash_set は、ハッシュ関数の出力を「変更」して、バケットの数に収まるようにします。

あなたが説明するアイデンティティ関数は、多くのハッシュテーブル実装(GCCを含む)にとって悪いハッシュ関数ではありません。実際、多くの人が使用しており、明らかに効率的です。悪い例は暗号化ハッシュ関数ですが、それには別の目的があります。

于 2012-04-24T07:37:08.867 に答える