(* Hasht.sig *) (* Hash tables and hash functions *) (* Hash tables are hashed association tables, with in-place modification. *) type ('a, 'b) t; (* The type of hash tables from type ['a] to type ['b]. *) val new : int -> ('_a, '_b) t; (* [new n] creates a new, empty hash table, with initial size [n]. The table grows as needed, so [n] is just an initial guess. Better results are said to be achieved when [n] is a prime number. *) val clear : ('a, 'b) t -> unit; (* Empty a hash table. *) val insert : (''_a, '_b) t -> ''_a -> '_b -> unit; (* [insert tbl x y] adds a binding of [x] to [y] in table [tbl]. The previous binding for [x] is removed (if any). *) val find : (''a, 'b) t -> ''a -> 'b; (* [find tbl x] returns the current binding of [x] in [tbl], or raises [Subscript] if no such binding exists. *) val peek : (''a, 'b) t -> ''a -> 'b option; (* [peek tbl x] returns SOME v, where v is the current binding of x in tbl, if any; otherwise returns NONE. *) val remove : (''a, 'b) t -> ''a -> unit; (* [remove tbl x] removes the current binding of [x] in [tbl]. It does nothing if [x] is not bound in [tbl]. *) val apply : ('a -> 'b -> unit) -> ('a, 'b) t -> unit; (* [apply f tbl] applies [f] to all bindings in table [tbl]. [f] receives the key as first argument, and the associated value as second argument. The order in which the bindings are passed to [f] is unpredictable. *) val fold : ('a -> 'b -> 'c -> 'c) -> 'c -> ('a, 'b) t -> 'c (* [fold f e tbl] computes f k1 d1 (f k2 d2 (...(f kn dn c)...)) where (k1, d1), (k2, d2), ..., (kn, dn) are the bindings of tbl in some unpredictable order. *) (*** The polymorphic hash primitive *) val hash : 'a -> int; (* [hash x] associates a positive integer to any value of any type. It is guaranteed that if [x = y], then [hash x = hash y]. Moreover, [hash] always terminates, even on cyclic structures. *) prim_val hash_param : int -> int -> 'a -> int = 3 "hash_univ_param"; (* [hash_param n m x] computes a hash value for [x], with the same properties as for [hash]. The two extra parameters [n] and [m] give more precise control over hashing. Hashing performs a depth-first, right-to-left traversal of the structure [x], stopping after [n] meaningful nodes were encountered, or [m] nodes, meaningful or not, were encountered. Meaningful nodes are: integers; floating-point numbers; strings; characters; booleans; and constant constructors. Larger values of [m] and [n] means that more nodes are taken into account to compute the final hash value, and therefore collisions are less likely to happen. However, hashing takes longer. The parameters [m] and [n] govern the tradeoff between accuracy and speed. *)