# Module Std_internal.Hashtbl

    module Hashtbl: Core_hashtbl

For many students of ocaml, using hashtables is complicated by the functors. Here are a few tips:
For a list of hashtable functions see `Hashtbl_intf.S`.
To create a hashtable with string keys use String.Table.

        let table = String.Table.create () ~size:4 in
        List.iter ~f:(fun (key, data) -> Hashtbl.set table ~key ~data)
          [ ("A", 1); ("B", 2); ("C", 3); ];
        Hashtbl.find table "C"

Here 4 need only be a guess at the hashtable's future size. There are other similar pre-made hashtables, eg Int63.Table or Host_and_port.Table.
To create a hashtable with a custom key type use Hashable.

            module Key = struct
              module T = struct
                type t = String.t * Int63.t with sexp
                let compare = compare
                let hash = Hashtbl.hash
              end
              include T
              include Hashable.Make (T)
            end
            let table = Key.Table.create () ~size:4 in
            List.iter ~f:(fun (key, data) -> Hashtbl.set table ~key ~data)
              [ (("pi", Int63.zero), 3.14159);
                (("e", Int63.minus_one), 2.71828);
                (("Euler", Int63.one), 0.577215);
              ];
            Hashtbl.find table ("pi", Int63.zero)

Performance may improve if you define `equal` and `hash` explicitly, eg:

            let equal (x, y) (x', y') = String.(=) x x' && Int63.(=) y y'
            let hash (x, y) = String.hash x + Int63.hash y * 65599

    include Core_hashtbl_intf.Hashtbl