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 [@@deriving 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 We use [@@deriving sexp_of] but not [@@deriving sexp] because we want people to
be explicit about the hash and comparison functions used when creating hashtables.
One can use Hashtbl.Poly.t, which does have [@@deriving sexp], to use
polymorphic comparison and hashing.
 create_mapped get_key get_data [x1,...,xn]
         = of_alist [get_key x1, get_data x1; ...; get_key xn, get_data xn]
      create_with_key ~get_key [x1,...,xn]
         = of_alist [get_key x1, x1; ...; get_key xn, xn] like filter_map, but function takes both key and data as arguments
returns new maps with bound values partitioned by f applied to the bound values
like partition_map, but function takes both key and data as arguments
Merge two hashtables.
The result of merge f h1 h2 has as keys the set of all k in the
union of the sets of keys of h1 and h2 for which d(k) is not
None, where:
d(k) =
k in h1 is to d1, and h2 does not map k;k in h2 is to d2, and h1 does not map k;k in h1 is to d1 and k in h2 is to d2.Each key k is mapped to a single piece of data x, where d(k) = Some x.
Returns the list of all data for given hashtable.
filter_inplace t ~f removes all the elements from t that don't satisfy f.
map_inplace t ~f applies f to all elements in t, transforming them in place
filter_map_inplace combines the effects of map_inplace and filter_inplace