Fix FNV variant in comments: this is FNV-1, not FNV-1a

The implementation uses multiply-then-XOR order, which is FNV-1.
FNV-1a would XOR first, then multiply. The constants (offset_basis
and prime) are the same for both variants; only the operation order
differs. Fix comments in cc_stubs.c, CCInt.ml, and CCHash.ml.

No behavioral change — just correcting the documentation.
This commit is contained in:
Simon Cruanes 2026-02-16 12:46:09 +00:00
parent bb6de2ff05
commit d493f6696b
3 changed files with 8 additions and 3 deletions

View file

@ -7,7 +7,7 @@ type 'a t = 'a -> hash
type 'a iter = ('a -> unit) -> unit
type 'a gen = unit -> 'a option
(* FNV hashing
(* FNV-1 hashing (multiply then XOR)
https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function
*)
let fnv_offset_basis = 0xcbf29ce484222325L

View file

@ -4,7 +4,7 @@ include Int
type 'a iter = ('a -> unit) -> unit
(* use FNV:
(* use FNV-1:
https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function *)
external hash : (int[@untagged]) -> (int[@untagged])
= "caml_cc_hash_int_byte" "caml_cc_hash_int" [@@noalloc]

View file

@ -1,9 +1,14 @@
#include <caml/mlvalues.h>
#include <stdint.h>
/* FNV-1a hash for a 64-bit integer.
/* FNV-1 hash for a 64-bit integer.
https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function
FNV-1 order: multiply then XOR (as opposed to FNV-1a which XORs first).
Uses the standard 64-bit FNV parameters:
offset_basis = 0xcbf29ce484222325
prime = 0x00000100000001b3
Core routine: operates on all 8 bytes of an int64_t. */
static inline int64_t cc_fnv_hash_int64(int64_t n) {