Hash
ハッシュ(散列 )アルゴリズム - 任意 の長 さのデータを固定長 に変換 する技術 。
用語
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
}線形探査
公式説明
公式 :
コードでは: (key%size + i) % size
二次探査
公式説明
公式 :
コードでは: (key%size + i*i) % size
二重ハッシュ
公式説明
公式 :
コードでは: (h1 + i*h2) % size
h1 = key % sizeh2 = 1 + (key % (size - 1))
Hash Algorithms
MD5 (Message Digest Algorithm 5)
- 出力 : 128-bit (32 hex characters)
- 用途 : ファイル整合性検証 、checksum
- 注意 : パスワードハッシュには非推奨 (既 に破 られている)
その他 の一般的 な Hash アルゴリズム
| アルゴリズム | 出力長 | 安全性 | 用途 |
|---|---|---|---|
| MD5 | 128-bit | 弱 | ファイル検証 |
| SHA-1 | 160-bit | 弱 | 旧版 Git |
| SHA-256 | 256-bit | 強 | ブロックチェーン、TLS |
| SHA-3 | 可変 | 強 | 新標準 |