sig
  module type S =
    sig
      type t
      val digest_size : int
      val init : unit -> Nocrypto.Hash.S.t
      val feed : Nocrypto.Hash.S.t -> Cstruct.t -> unit
      val get : Nocrypto.Hash.S.t -> Cstruct.t
      val digest : Cstruct.t -> Cstruct.t
      val digestv : Cstruct.t list -> Cstruct.t
      val hmac : key:Cstruct.t -> Cstruct.t -> Cstruct.t
    end
  module MD5 : S
  module SHA1 : S
  module SHA224 : S
  module SHA256 : S
  module SHA384 : S
  module SHA512 : S
  type hash = [ `MD5 | `SHA1 | `SHA224 | `SHA256 | `SHA384 | `SHA512 ]
  val digest : [< Nocrypto.Hash.hash ] -> Cstruct.t -> Cstruct.t
  val mac :
    [< Nocrypto.Hash.hash ] -> key:Cstruct.t -> Cstruct.t -> Cstruct.t
  val digest_size : [< Nocrypto.Hash.hash ] -> int
  val module_of : [< Nocrypto.Hash.hash ] -> (module Nocrypto.Hash.S)
  val hash_of_sexp : Sexplib.Sexp.t -> Nocrypto.Hash.hash
  val sexp_of_hash : Nocrypto.Hash.hash -> Sexplib.Sexp.t
end