package ppx_hash

  1. Overview
  2. Docs
A ppx rewriter that generates hash functions from type expressions and definitions

Install

Dune Dependency

Authors

Maintainers

Sources

ppx_hash-v0.16.0.tar.gz
sha256=9b012546b7b9278bfd536f802fb6da88a11ebb5340d8aa47e9bf49acbf13b6e5

Description

Part of the Jane Street's PPX rewriters collection.

Published: 02 Jun 2023

README

ppx_hash

A ppx writer that generates hash functions from type expressions and definitions.

Syntax

Type definitions: [@@deriving hash] Expressions: [%hash_fold: TYPE] and [%hash: TYPE] Types, record fields: [@hash.ignore]

Basic usage

    type t = {
      s : string;
      x : (int * bool) list;
    }
    [@@deriving hash]

This will generate a function hash_fold_t : Hash.state -> t -> Hash.state.

Where Hash is Ppx_hash_lib.Std.Hash.

The generated function follows the structure of the type; allowing user overrides at every level. This is in contrast to ocaml's builtin polymorphic hashing Hashtbl.hash which ignores user overrides.

Also generated is a direct hash-function hash : t -> Hash.hash_value. This function will be named hash_<T> when != "t".

The direct hash function is the one suitable for Hashable.Make.

Signature

In a module signature, type t [@@deriving hash] will add both hash_fold_t and hash (or hash_<T>) to the signature.

Hashing without a type definition

A folding hash function is accessed/created as [%hash_fold: TYPE]. A direct hash function is accessed/created as [%hash: TYPE].

Ignoring part of types

Types can be annotated with [@hash.ignore] so that they are not incorporated into the computed hash value.

  type second_only = (string [@hash.ignore]) * int [@@deriving hash]

Mutable records fields must have such an annotation.

    type t = {
      mutable s : string [@hash.ignore];
      x : (int * bool) list;
    }
    [@@deriving hash]

Special support for ppx_compare

The annotation [@compare.ignore] (and [@ignore]) implies [@hash.ignore], in order to preserve the invariant that compare x y = 0 implies hash x = hash y.

Adapting code to ppx_hash

So long as all types in support hashing, the following common pattern:

    module T = struct
      type t = <TYPE-EXP> [@@deriving compare, sexp]
      let hash = Hashtbl.hash
    end
    include T
    include Hashable.Make (T)

Can this be written as:

    module T = struct
      type t = <TYPE-EXP> [@@deriving compare, hash, sexp]
    end
    include T
    include Hashable.Make (T)

More information

ppx/ppx_hash/doc/design.notes
ppx/ppx_hash/runtime-lib/make_std.ml

Dependencies (6)

  1. ppxlib >= "0.28.0"
  2. dune >= "2.0.0"
  3. ppx_sexp_conv >= "v0.16" & < "v0.17"
  4. ppx_compare >= "v0.16" & < "v0.17"
  5. base >= "v0.16" & < "v0.17"
  6. ocaml >= "4.14.0"

Dev Dependencies

None

Used by (18)

  1. boomerang
  2. colibri2
  3. commons >= "1.8.0"
  4. coq-lsp >= "0.2.0+8.17"
  5. coq-serapi >= "8.16.0+0.16.0"
  6. core >= "v0.16.0" & < "v0.17.0"
  7. core-and-more
  8. data-encoding >= "0.6"
  9. farith
  10. n_ary < "v0.17.0"
  11. nsq >= "0.5.0" & < "0.5.2"
  12. opine
  13. ppx_bap < "v0.14.0"
  14. ppx_base = "v0.16.0"
  15. provider < "0.0.9"
  16. pyre-ast
  17. sexp_grammar = "v0.16.0"
  18. string_dict = "v0.16.0"

Conflicts

None

OCaml

Innovation. Community. Security.