Module Hashtbl


module Hashtbl: sig  end
ハッシュテーブルとハッシュ関数です。

ハッシュテーブルはハッシュ化された連想テーブルです。内部置き換え式です。




Generic interface



type ('a, 'b) t
'a から型 'b へのハッシュテーブルの型です。

val create : int -> ('a, 'b) t
Hashtbl.create n は空のハッシュテーブルを新しく作って返します。初期サイズは n です。効率を考えると、n はハッシュテーブルに入れる要素の予想数オーダになっているとよいです。テーブルは必要に応じて大きくなりますから、n は初期の見当にすぎません。
val clear : ('a, 'b) t -> unit
ハッシュテーブルを空にします。
val add : ('a, 'b) t -> 'a -> 'b -> unit
Hashtbl.add tbl x y はテーブル tblx から y への束縛を追加します。 元からあった x の束縛は取り除かれず、隠れるだけです。つまり、あとで Hashtbl.remove tbl x を行うと、元からあった x の束縛が (あればですが) 再度有効になります (連想リストと同じ振る舞いです) 。
val copy : ('a, 'b) t -> ('a, 'b) t
与えられたハッシュテーブルのコピーを返します。
val find : ('a, 'b) t -> 'a -> 'b
Hashtbl.find tbl x はテーブル tbl で現在 x が束縛しているものを返します。該当する束縛がない場合は例外 Not_found を発生します。
val find_all : ('a, 'b) t -> 'a -> 'b list
Hashtbl.find_all tbl x はテーブル tblx が束縛しているすべてのデータをリストにして返します。 先頭に現在の束縛、それから元からあった束縛、というように、テーブルに追加された順の逆順で返します。
val mem : ('a, 'b) t -> 'a -> bool
Hashtbl.mem tbl x はテーブル tblx の束縛があるかどうか検査します。
val remove : ('a, 'b) t -> 'a -> unit
Hashtbl.remove tbl x はテーブル tbl から現在の x の束縛を取り除きます。 元からあった束縛があれば再度有効になります。 テーブル tblx の束縛がなかったら何もしません。
val replace : ('a, 'b) t -> 'a -> 'b -> unit
Hashtbl.replace tbl x y はテーブル tbl で現在の x の束縛を x から y への束縛と置き換えます。テーブル tblx の束縛がなかったら、x から y への束縛を追加します。機能的には Hashtbl.remove tbl x したあと Hashtbl.add tbl x y するのと等価です。
val iter : ('a -> 'b -> unit) -> ('a, 'b) t -> unit
Hashtbl.iter f tbl はテーブル tbl のすべての束縛を関数 f に適用します。f は第一引数にキーを、第二引数に連想値を取ります。どの束縛からどういう順に f を適用されるかは規定されていません。それぞれの束縛は 1 回ずつ関数 f に与えられます。
val fold : ('a -> 'b -> 'c -> 'c) -> ('a, 'b) t -> 'c -> 'c
Hashtbl.fold f tbl init(f kN dN ... (f k1 d1 init)...) を評価します。k1 ... kN はテーブル tbl にあるすべての束縛のキーで、d1 ... dN は連想値です。 どの束縛からどういう順に f を適用されるかは規定されていません。それぞれの束縛は 1 回ずつ関数 f に与えられます。


Functorial interface


module type HashedType = sig  end
functor Hashtbl.Make の入力 signature です。
module type S = sig  end
Hashtbl.Make の出力 signature です。
module Make: functor (H : HashedType) -> sig  end
ハッシュテーブル構造の実装を生成する functor です。


The polymorphic hash primitive


val hash : 'a -> int
Hashtbl.hash x はどんあ型のどんな値でも正整数に関連づけます。x = y ならば hash x = hash y であることが保証されています。さらに、hash はたとえ循環構造を与えられても必ず停止します。
val hash_param : int -> int -> 'a -> int
Hashtbl.hash_param n m xx のハッシュ値を計算します。このハッシュ値は hash と同じ特性を持ちます。nm というパラメータが 2 つ増えていて、ハッシングを細かくコントロールできます。ハッシングは x の構造を深さ優先、右から左へ縦断してスキャンします。意味のあるノードを n 回スキャンするか、意味のあるないに関わらずノードを m 回スキャンしたら停止します。意味のあるノードとは、整数、浮動小数点小数、文字列、文字、真偽値、定コンストラクタです。mn を大きくすると、最終的に出力されるハッシュ値を計算する情報として、より多くのノードを取り入れることになり、衝突が発生する可能性は減ると思われます。しかしハッシングに時間がかかるようになります。mn のパラメータは正確さと速度のトレードオフを決定します。