A Scheme implementation of the SipHash family of hash functions.
SipHash is a cryptographically strong family of hash functions designed by Jean-Philippe Aumasson and Daniel J. Bernstein.
The source for this extension is available here.
Three functions are provided:
- make-siphash c dprocedure
make-siphash constructs a hashing function.
It takes two positive integer arguments c and d and returns a hashing procedure with that many compression and finalization rounds, respectively.
The returned procedure's signature matches those of siphash-2-4 and siphash-4-8.
- siphash-2-4 keyprocedure
- siphash-2-4 key messageprocedure
- siphash-4-8 keyprocedure
- siphash-4-8 key messageprocedure
siphash-2-4 and siphash-4-8 are predefined hashing procedures.
Each takes one or two SRFI-4 u8vector arguments, the key and message to hash, and returns a positive integer. key should have a length of 16, while message may be any length. If message isn't given, a prekeyed hashing function is returned.
The SipHash specification recommends SipHash-2-4 for performance and SipHash-4-8 for cryptographic security.
> (define string->u8vector (compose blob->u8vector string->blob)) > (define key (u8vector 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)) > (define msg (string->u8vector "The rain in Spain falls mainly on the plain.")) > (siphash-2-4 key msg) ; => 8751579407287093977 > ((siphash-4-8 key) msg) ; => 13472556437817646137 > ((make-siphash 8 16) key (string->u8vector "In Hertford, Hereford and Hampshire, hurricanes hardly ever happen.")) ; => 9275736844991428064