Hash

ハッシュ(散列(さんれつ) )アルゴリズム - 任意(にんい)(なが) さのデータを固定長(こていちょう)変換(へんかん) する技術(ぎじゅつ)

H(x)=HashCode H(x) = Hash Code

用語

Hashing Function

  • ハッシュ関数(かんすう)
    • 基本要件(きほんようけん)
      • 入力(にゅうりょく)任意(にんい) のサイズのデータ
      • 出力(しゅつりょく)固定範囲(こていはんい)(あたい)
      • (おな)入力(にゅうりょく)(おな)出力(しゅつりょく)()
      • できるだけ均一(きんいつ)分布(ぶんぷ)理想的(りそうてき)場合(ばあい)
詳細説明
データを特定(とくてい)計算方法(けいさんほうほう)計算(けいさん) し、結果(けっか) をデータ格納(かくのう) アドレスに変換(へんかん) できる。()Hashing Function計算(けいさん)簡単(かんたん) で、衝突(しょうとつ)(すく) なく、ハッシュテーブルの格納状況(かくのうじょうきょう)均一(きんいつ) にする。

Hash Code

  • ハッシュ()
詳細説明
(もと) のデータ x がハッシュ関数(かんすう) H計算(けいさん) された結果(けっか)計算結果(けいさんけっか) から(もと) のデータを逆算(ぎゃくさん) できない(**不可逆(ふかぎゃく) **)。

Hash Table

  • ハッシュテーブル
詳細説明
連続(れんぞく) したメモリで、データを格納(かくのう) するために使用(しよう) される。(かく) データは1つの位置(いち) (Bucket)に対応(たいおう) する。

Bucket

  • バケット
詳細説明
ハッシュテーブル(ない)特定(とくてい) のデータは特定(とくてい) のアドレス(Bucket Address)に格納(かくのう) される。

Collision

  • 衝突(しょうとつ)
詳細説明
複数(ふくすう) のデータがハッシュ関数(かんすう)(おな) じハッシュ()()場合(ばあい)(おな) じバケットアドレスを使用(しよう) することになる。

Overflow

  • オーバーフロー
詳細説明
データがハッシュ関数(かんすう)計算(けいさん) された(あと) 、ハッシュ()() すバケットアドレスが(ほか) のデータで満杯(まんぱい)場合(ばあい) 、このデータをそのアドレスに格納(かくのう) できない。

オーバーフロー処理

  • 分離連鎖法(ぶんりれんさほう) Separate Chaining

  • 開放(かいほう) アドレス(ほう) Open Addressing Mode

    • 線形探査(せんけいたんさ) Linear Probing
    • 二次探査(にじたんさ) Quadratic Probing
    • 二重(にじゅう) ハッシュ Double Hashing
  • h(k, i)i 回目(かいめ)探査位置(たんさいち)

  • h'(k)初期(しょき) ハッシュ関数(かんすう)通常(つうじょう) key mod size

  • i探査回数(たんさかいすう) (0, 1, 2, …)

  • m はハッシュテーブルのサイズ

線形探査
func (hm *HashMap) linearProbing(hash uint64) uint64 {
  return (hash + 1) % hm.capacity
}
二次探査
// 二次探査
func (hm *HashMap) quadraticProbing(hash uint64, i int) uint64 {
  return (hash + uint64(i*i)) % hm.capacity
}
二重ハッシュ
func (hm *HashMap) doubleHashing(hash uint64, key any) uint64 {
  // 第二ハッシュ関数を使用
  h2 := someOtherHashFunction(key)
  return (hash + h2) % hm.capacity
}

線形探査

公式説明

公式(こうしき)

h(k,i)=(h(k)+i)modm h(k, i) = (h'(k) + i) \mod m

コードでは: (key%size + i) % size

二次探査

公式説明

公式(こうしき)

h(k,i)=(h(k)+i2)modm h(k, i) = (h'(k) + i^2) \mod m

コードでは: (key%size + i*i) % size

二重ハッシュ

公式説明

公式(こうしき)

h(k,i)=(h1(k)+i×h2(k))modm h(k, i) = (h1(k) + i \times h2(k)) \mod{m}

コードでは: (h1 + i*h2) % size

  • h1 = key % size
  • h2 = 1 + (key % (size - 1))

Hash Algorithms

MD5 (Message Digest Algorithm 5)

  • 出力(しゅつりょく) : 128-bit (32 hex characters)
  • 用途(ようと) : ファイル整合性検証(せいごうせいけんしょう) 、checksum
  • 注意(ちゅうい) : パスワードハッシュには非推奨(ひすいしょう)(すで)(やぶ) られている)

その(ほか)一般的(いっぱんてき) な Hash アルゴリズム

アルゴリズム出力長(しゅつりょくちょう)安全性(あんぜんせい)用途(ようと)
MD5128-bit(じゃく)ファイル検証(けんしょう)
SHA-1160-bit(じゃく)旧版(きゅうばん) Git
SHA-256256-bit(きょう)ブロックチェーン、TLS
SHA-3可変(かへん)(きょう)新標準(しんひょうじゅん)