2017-05-04 12 views
2

ハッシュテーブルがインデックス0〜HASHSIZE-1の配列であるとします。この関数は正しい範囲の値を返し、実行時エラーを生成しません。渡されたStringに少なくとも2文字が含まれているとします。なぜそれは貧弱なハッシュ関数ですか?与えられたハッシュ関数はなぜ貧弱なハッシュ関数ですか?

public static int hash(String key) { 
    return (key.charAt(0) 
      + key.charAt(1) 
      + key.charAt(key.length()-1) % HASHSIZE; 
} 
+1

多くの衝突があるように見えますが、これは貧弱です。 – Carcigenicate

+1

ディストリビューションを確認してください –

+1

また、ほとんど役に立たない文字列の内容を無視しているようです。 – Carcigenicate

答えて

2

ハッシュ関数の品質は、期待されるキーの集まりの中で作成する衝突の数によって異なります。良い関数は、異なるキーが同じハッシュコードを生成しにくい状況を作ります。

この手法の品質は、使用されているキーの予想される長さによって異なります。長さ3のキーでは、これは完全に許容される方法ですが、ハッシュは文字の順序に基づいて変化しないため、理想的ではありません。

長さが10のキーの場合、この方法は、同じ文字の末尾に同じ文字のペアから始まるすべてのキーの衝突を生成します。 2つの最初の文字と最後の文字の組み合わせが頻繁に繰り返されると、衝突が発生し、このハッシュ関数の有用性が低下します。

+0

また、関数は完全な 'int'範囲を使用しません。結果は196605を超えることはないので、 'HASHSIZE'がそれより大きい場合、テーブルの上部は完全に使用されず、下部には多くの回避可能な衝突があります。 – Holger