2012-09-24 4 views
7

なぜHashtableが負のハッシュコードを使用しないのですか? (hash & 0x7FFFFFFF)は、符号ビットが正の0になりますが、なぜ我々は、符号なしとして符号付き32ビット整数を扱うことができませんでしたハッシュテーブルのハッシングが負のハッシュコードを避ける

int hash = key.hashCode(); 
int index = (hash & 0x7FFFFFFF) % tab.length; 

?モジュラートリックを使用してそれが正になるようにすることさえできます。例えば、

public static long int_mod(int hashcode, int tab_length){ 
    return (hashcode % tab_length + tab_length) % tab_length; 
} 
+0

この方法は簡単で効果的だと思います。それがおそらくそれが使われた理由です。 '(ハッシュ&0x7FFFFFFF)'が正の値に、 '%tab.length'がタブのサイズに狭くなります。シンプルで清潔で簡単。 –

+0

どの方法を参考にしていますか?元の実装ですか? – peter

+0

はい。既に実装されています。 –

答えて

9

値は、それが値(及びオーバーフロー要素)を格納する(この場合tab)内部配列へのインデックスとして使用されるため0tab.length - 1の間でなければなりません。したがって、それは否定できない。

(hashcode % tab.length + tab.length) % tab.lengthは、衝突の可能性を過度に増加させることなく、より速くなるため、​​が使用されていると想定していますが、設計ドキュメントを見つけたり、

2

...しかし、なぜできない私たち...

特定の実装を選択した理由をあなたは求めています。彼または彼女が覚えていれば、コードの元の著者を除いて誰もあなたにそれを伝えることはできません。

コード内にアイデアを実装する方法は常に複数あります。コードを書いている人は、そのうちの1つを選択しなければなりません。事実の後に別の特定の実装が選択されなかった理由を尋ねることは、多くの意味を持ちません。

+0

私は仕事を提案したというアイデアもありますか? – peter

+0

私はチェックしていませんが、私はそう思います。なぜそれが実装されているかに不満はありますか? – Jesper

+1

私は満足しています。私は他の選択肢を疑問に思っているだけです。 – peter

1

Javaには未署名の型がありません。 hashCodeが負の値を持つ場合は、hashCodeを配列のインデックスとして使用するあらゆる場所で、このようなマスキングトリックを適用する必要があります。

0

については誰も教えてくれないのですがなぜオリジナルの著者は、自分自身(そしておそらく同僚)を除いてその実装を選択しました。それはうまく動作するので、それは本当に問題ではありません。

提案された実装について:おそらくあなたがしていることを実行していません。と思ってください。と思っています。 javaの%演算子が実際に行う処理を更新する必要があります。For example here。整数オーバーフローをミックスに追加し、提案された式が負の値になる可能性があります。

1

署名されたintを符号なしとして扱うことができない大きな理由があります。元のJava開発者は、不要な複雑さは、符号なし算術としてconfusingになる可能性があります。これはJavaが対処するのに十分な大きさの問題ではありません。 verdesmerald mentionedとして

、我々は最終的に我々は唯一それが作られた理由を推測することができ、意思決定のための正当化を見つけることができますが​​は、あなたの巧妙な改造の効果に何かの上に選ばれた理由の明確な記録がないので。

セマンティクスの最終点は、おそらくそれほど重要ではありません。ハッシュテーブルは、ハッシュコードがインデックスのために非負形式に「変換」されているので、負のハッシュコードを使用していません。

2

あなたは容量2のパワーを維持する場合は、

private static final int CAPACITY = 64; 
private static final int HASH_MASK = CAPACITY - 1; 

final int index = obj.hashCode() & HASH_MASK; 

基本的に、あなたが関心のある下位ビットが、すべてをマスク。より低いNビットが、ハッシュコード全体と同じ分布を有すると仮定する。

関連する問題