module type Full = Base__.Hash_intf.Fullmodule type S = Base__.Hash_intf.Smodule F : functor (Hash : S) -> Full with type hash_value = Hash.hash_value and type state = Hash.state and type seed = Hash.seedThe code of ppx_hash is agnostic to the choice of hash algorithm that is
used. However, it is not currently possible to mix various choices of hash algorithms
in a given code base.
We experimented with:
Our findings were as follows:
Hence, we are here making the choice of using this Internalhash (that is, Murmur3, the OCaml hash algorithm as of 4.03) as our hash algorithm. It means that the state of the hash function does not need to be preallocated, and makes for simpler use in hash tables and other structures.
include Full with type Full.state = private int and type Full.seed = int and type Full.hash_value = intfold_<T> state v incorporates a value v of type <T> into the hash-state,
returning a modified hash-state. Implementations of the fold_<T> functions may
mutate the state argument in place, and return a reference to it. Implementations
of the fold_<T> functions should not allocate.
reset ?seed state initializes/resets a hash-state with the given seed, or else a
default-seed. Argument state may be mutated. Should not allocate.
module For_tests : sig ... endval of_fold : (state ‑> 'a ‑> state) ‑> 'a ‑> hash_valueof_fold fold constructs a standard hash function from an existing fold
function.
module Builtin : sig ... endval run : ?seed:seed ‑> 'a folder ‑> 'a ‑> hash_valuerun ?seed folder x runs folder on x in a newly allocated hash-state,
initialized using optional seed or a default-seed.
The following identity exists: run [%hash_fold: T] == [%hash: T]
run can be used if we wish to run a hash-folder with a non-default seed.