## 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.