web-dev-qa-db-ja.com

ハッシュ関数分類

インターネットで、私はこの質問に遭遇しました:

キー値を見つけるさまざまな方法に基づいてハッシュ関数を分類します。

のような答えで

  • 直接法
  • 減算方式
  • Modulo-Divisionメソッド
  • 桁抽出法
  • ミッドスクエア法
  • 折り方
  • 疑似ランダム法

奇妙だと思います。私はハッシュについてはよく知っていると思いますが、これは私には明白に意味不明です、誰かが説明できますか?

9
maaartinus

これらは、ハッシュコードを、値を含む配列のインデックスに変換する方法です。 0x12345678のハッシュコードがあるとします。非常に大きな数であり、このサイズの配列を持つことはほとんどありません。あなたがするなら、あなたはただすることができます

Value = array[0x12345678];

そして、行われます(直接法)。

そうしないと、衝突を回避しすぎないようにしながら、この値を配列サイズに適合する値に変換する方法がわかります。使用される用語はおそらく他の名前でも知られていますが、たとえば、ハッシュコードの上位ビットをマスクすることができます

Value = array[hashcode & 0xffff];

または、配列サイズに対してハッシュコードを変更します

Value = array[hashcode % array.size()]; // modulo division

など

編集:this link が役立つかもしれません

4
James