6.30. kink/container/HASH_MAP¶
キーをハッシュテーブルに格納するmapの実装を提供する。
キーが公衆から渡され得る場合、DDoS攻撃を防ぐため、ハッシュ値の分布が予測できないようにしよう。暗号学的ハッシュ関数を使い、また暗号学的なランダムデータによるキーの伸長を行う必要があるかもしれない。
6.30.1. HASH_MAP.new($hash ...[$config={}])¶
newは、空のハッシュmapを新しく作って戻す。
コンフィグメソッド
• C.eq($eq?): default = {(:X :Y) X == Y }
キーの同値性
キーを比較するには$eq?が使われる。$eq?は同値関係であり、キーの定義域内のすべてのX, Y, Zについて次の条件を満たさなければならない。
• 反射律: eq?(X X)
• 対称律: (if eq?(X Y) then eq?(Y X)) and (if not eq?(X Y) then not eq?(Y X))
• 推移律: if eq?(X Y) and eq?(Y Z) then eq?(X Z)
ハッシュ
$hashは、キーの定義域内のすべてのX, Yについて、次の条件を満たさなければならない。
• if eq?(X Y) then hash(X) == hash(Y)
事前条件
$hashはキーを取り、整数のnumを戻す関数でなければならない。
$eq?はふたつのキーを取り、boolを戻す関数でなければならない。
例
:HASH_MAP.require_from('kink/container/')
:VAL.require_from('kink/')
:X <- new_val
:Y <- new_val
:Z <- new_val
:Map <- HASH_MAP.new(VAL$id_hash){(:C)
C.eq(VAL$same?)
}
Map.set(X 'x')
Map.set(Y 'y')
Map.set(Z 'z')
stdout.print_line(Map.get(X).repr) # => "x"