Expand description

A slow, but clear reference implementation of SeaHash.

Specification

The input buffer is padded with null bytes until the length is divisible by 8.

We start out with state

a = 0x16f11fe89b0d677c
b = 0xb480a793d8e6c86c
c = 0x6fe2e5aaf078ebc9
d = 0x14f994a4c5259381

If a seed is given, each of the initial state component are modularly multiplied by the seed.

From the stream, we read one 64-bit block (in little-endian) at a time. This number, n, determines the new state by:

a' = b
b' = c
c' = d
d' = g(a ⊕ n)

g(x) is defined as g(x) = j(h(j(x))) with h(x) = (x ≫ 32) ≫ (x ≫ 60) and j(x) ≡ px (mod 2^64) with p = 0x7ed0e9fa0d94a33.

Let the final state be (x, y, z, w). Then the final result is given by H = g(x ⊕ y ⊕ z ⊕ w ⊕ l) where l is the number of bytes in the original buffer.

Functions

A reference implementation of SeaHash.

The seeded version of the reference implementation.