6.31. kink/container/HASH_SET

要素をハッシュテーブルに格納するsetの実装を提供する。

要素が公衆から渡され得る場合、DDoS攻撃を防ぐため、ハッシュ値の分布が予測できないようにしよう。暗号学的ハッシュ関数を使い、また暗号学的なランダムデータによる値の伸長を行う必要があるかもしれない。

6.31.1. HASH_SET.new($hash ...[$config={}])

newは、空のハッシュsetを新しく作って戻す。

コンフィグメソッド

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_SET.require_from('kink/container/')
:VAL.require_from('kink/')

:X <- new_val
:Y <- new_val
:Z <- new_val

:Set <- HASH_SET.new(VAL$id_hash){(:C)
  C.eq(VAL$same?)
}
Set.push(X)
Set.push(Y)
stdout.print_line(Set.have?(X).repr)  # => true
stdout.print_line(Set.have?(Z).repr)  # => false