Module hash

hash
Stability: stable — changes additively from here.

Hashing — the Hasher implementations behind the prelude's Hash trait (plans/archive/STD_API_AUDIT.md D3.9, plans/reference/HASHER_REDESIGN.md).

The split is Rust's: a type's Hash impl says WHICH bytes make up its identity (hash(self, hasher) feeds them in), and a Hasher says how those bytes become a u64 (write/write_u* accumulate, finish reads out). Any Hash value can therefore be hashed by any algorithm, and one hasher can consume a whole sequence of values (a tuple, a struct's fields, a collection's elements).

  • SipHasher13 — SipHash-1-3, keyed, the algorithm HashMap/HashSet drive (as in Rust). With the default keys it is deterministic across runs; a map built with with_keys is keyed per instance.
  • Fnv1aHasher — FNV-1a, unkeyed and tiny; for short identifiers where speed beats collision resistance.
  • DefaultHasher — the alias HashMap uses (SipHasher13).
  • hash_one(value) — the one-liner: hash a single value with the default hasher and default keys.

Stability

stable — the Hash/Hasher split is Rust's and the algorithm is real SipHash-1-3 with a 128-bit key, verified against reference vectors in tests/hash.test.yo. The one live question near this module — plans/archive/STD_API_STABILIZATION.md §5, whether to ship a HashMap.with_random_keys() beside today's deterministic new() — is answered with a NEW function over the new_with_keys this module already exports, so it is additive; the fixed DEFAULT_KEY_0/DEFAULT_KEY_1 are load-bearing for the compiler's own byte-identical-output fixpoint gate and are not going to change. Further hashers would be additive too.

Types

SipHasher13 struct
SipHasher13

SipHash-1-3 (one compression round per 8-byte block, three finalization rounds) with a 128-bit key, streaming: bytes may arrive in any grouping and the result depends only on their concatenation.

finish may be called at any point and does not reset the state.

Fields

NameTypeDescription
k0u64

First half of the 128-bit key. Kept so reset can re-derive the state without the caller passing the key again.

k1u64

Second half of the 128-bit key.

v0u64

SipHash internal state word 0, initialized to k0 ^ "somepseu".

v1u64

SipHash internal state word 1, initialized to k1 ^ "dorandom".

v2u64

SipHash internal state word 2, initialized to k0 ^ "lygenera".

v3u64

SipHash internal state word 3, initialized to k1 ^ "tedbytes".

tailu64

Up to 7 pending bytes, little-endian packed.

ntailusize

How many bytes tail holds.

lengthusize

Total bytes written.

Trait Implementations

impl(SipHasher13, ...)
new : (SipHasher13) fn() -> SipHasher13

A hasher with the default keys (DEFAULT_KEY_0, DEFAULT_KEY_1).

Returns: SipHasher13

new_with_keys : (SipHasher13) fn(k0 : u64, k1 : u64) -> SipHasher13

A hasher keyed by k0, k1.

Parameters

NameTypeNotesDescription
k0u64

First half of the 128-bit key. Kept so reset can re-derive the state without the caller passing the key again.

k1u64

Second half of the 128-bit key.

Returns: SipHasher13

reset : (SipHasher13) fn(self : &mut SipHasher13) -> unit

Forget everything written so far, keeping the keys.

Parameters

NameTypeNotes
selfSipHasher13

Returns: unit

_round : (SipHasher13) fn(self : &mut SipHasher13) -> unit

Parameters

NameTypeNotes
selfSipHasher13

Returns: unit

_compress : (SipHasher13) fn(self : &mut SipHasher13, m : u64) -> unit

Absorb one full 8-byte block (little-endian value m).

Parameters

NameTypeNotes
selfSipHasher13
mu64

Returns: unit

_push_byte : (SipHasher13) fn(self : &mut SipHasher13, b : u8) -> unit

Parameters

NameTypeNotes
selfSipHasher13
bu8

Returns: unit

impl(SipHasher13, Hasher(...))
write : (SipHasher13) fn(self : &mut SipHasher13, buf : *(u8), size : usize) -> unit

Feed size bytes starting at buf.

Parameters

NameTypeNotes
selfSipHasher13
buf*(u8)
sizeusize

Returns: unit

write_u64 : (SipHasher13) fn(self : &mut SipHasher13, v : u64) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vu64

Returns: unit

write_u8 : (SipHasher13) fn(self : &mut SipHasher13, v : u8) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vu8

Returns: unit

write_u16 : (SipHasher13) fn(self : &mut SipHasher13, v : u16) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vu16

Returns: unit

write_u32 : (SipHasher13) fn(self : &mut SipHasher13, v : u32) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vu32

Returns: unit

write_usize : (SipHasher13) fn(self : &mut SipHasher13, v : usize) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vusize

Returns: unit

write_i8 : (SipHasher13) fn(self : &mut SipHasher13, v : i8) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vi8

Returns: unit

write_i16 : (SipHasher13) fn(self : &mut SipHasher13, v : i16) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vi16

Returns: unit

write_i32 : (SipHasher13) fn(self : &mut SipHasher13, v : i32) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vi32

Returns: unit

write_i64 : (SipHasher13) fn(self : &mut SipHasher13, v : i64) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vi64

Returns: unit

write_isize : (SipHasher13) fn(self : &mut SipHasher13, v : isize) -> unit

Parameters

NameTypeNotes
selfSipHasher13
visize

Returns: unit

finish : (SipHasher13) fn(self : &SipHasher13) -> u64

The hash of everything written so far.

Parameters

NameTypeNotes
selfSipHasher13

Returns: u64

impl(SipHasher13, Default(...))
default : (SipHasher13) fn() -> SipHasher13

The default value of the type.

Returns: SipHasher13

Methods
clone : (SipHasher13) fn(self : &SipHasher13) -> SipHasher13

Parameters

NameTypeNotes
selfSipHasher13

Returns: SipHasher13

Fnv1aHasher struct
Fnv1aHasher

FNV-1a over the written bytes: 64-bit offset basis, prime 1099511628211. Unkeyed and fast; not collision-resistant against an adversary — pick SipHasher13 for anything an attacker can feed.

Fields

NameTypeDescription
stateu64

Trait Implementations

impl(Fnv1aHasher, ...)
new : (Fnv1aHasher) fn() -> Fnv1aHasher

A hasher at FNV-1a's 64-bit offset basis (14695981039346656037). There is no keyed variant — FNV-1a has no key.

Returns: Fnv1aHasher

impl(Fnv1aHasher, Hasher(...))
write : (Fnv1aHasher) fn(self : &mut Fnv1aHasher, buf : *(u8), size : usize) -> unit

Feed size bytes starting at buf.

Parameters

NameTypeNotes
selfFnv1aHasher
buf*(u8)
sizeusize

Returns: unit

finish : (Fnv1aHasher) fn(self : &Fnv1aHasher) -> u64

The hash of everything written so far.

Parameters

NameTypeNotes
selfFnv1aHasher

Returns: u64

impl(Fnv1aHasher, Default(...))
default : (Fnv1aHasher) fn() -> Fnv1aHasher

The default value of the type.

Returns: Fnv1aHasher

Methods
clone : (Fnv1aHasher) fn(self : &Fnv1aHasher) -> Fnv1aHasher

Parameters

NameTypeNotes
selfFnv1aHasher

Returns: Fnv1aHasher

write_u8 : (Fnv1aHasher) fn(self : &mut Fnv1aHasher, v : u8) -> unit

Parameters

NameTypeNotes
selfFnv1aHasher
vu8

Returns: unit

write_u16 : (Fnv1aHasher) fn(self : &mut Fnv1aHasher, v : u16) -> unit

Parameters

NameTypeNotes
selfFnv1aHasher
vu16

Returns: unit

write_u32 : (Fnv1aHasher) fn(self : &mut Fnv1aHasher, v : u32) -> unit

Parameters

NameTypeNotes
selfFnv1aHasher
vu32

Returns: unit

write_u64 : (Fnv1aHasher) fn(self : &mut Fnv1aHasher, v : u64) -> unit

Parameters

NameTypeNotes
selfFnv1aHasher
vu64

Returns: unit

write_usize : (Fnv1aHasher) fn(self : &mut Fnv1aHasher, v : usize) -> unit

Parameters

NameTypeNotes
selfFnv1aHasher
vusize

Returns: unit

write_i8 : (Fnv1aHasher) fn(self : &mut Fnv1aHasher, v : i8) -> unit

Parameters

NameTypeNotes
selfFnv1aHasher
vi8

Returns: unit

write_i16 : (Fnv1aHasher) fn(self : &mut Fnv1aHasher, v : i16) -> unit

Parameters

NameTypeNotes
selfFnv1aHasher
vi16

Returns: unit

write_i32 : (Fnv1aHasher) fn(self : &mut Fnv1aHasher, v : i32) -> unit

Parameters

NameTypeNotes
selfFnv1aHasher
vi32

Returns: unit

write_i64 : (Fnv1aHasher) fn(self : &mut Fnv1aHasher, v : i64) -> unit

Parameters

NameTypeNotes
selfFnv1aHasher
vi64

Returns: unit

write_isize : (Fnv1aHasher) fn(self : &mut Fnv1aHasher, v : isize) -> unit

Parameters

NameTypeNotes
selfFnv1aHasher
visize

Returns: unit

DefaultHasher struct
SipHasher13

The hasher HashMap/HashSet/hash_one use.

Fields

NameTypeDescription
k0u64

First half of the 128-bit key. Kept so reset can re-derive the state without the caller passing the key again.

k1u64

Second half of the 128-bit key.

v0u64

SipHash internal state word 0, initialized to k0 ^ "somepseu".

v1u64

SipHash internal state word 1, initialized to k1 ^ "dorandom".

v2u64

SipHash internal state word 2, initialized to k0 ^ "lygenera".

v3u64

SipHash internal state word 3, initialized to k1 ^ "tedbytes".

tailu64

Up to 7 pending bytes, little-endian packed.

ntailusize

How many bytes tail holds.

lengthusize

Total bytes written.

Methods
clone : (DefaultHasher) fn(self : &SipHasher13) -> SipHasher13

Parameters

NameTypeNotes
selfSipHasher13

Returns: SipHasher13

new_with_keys : (DefaultHasher) fn(k0 : u64, k1 : u64) -> SipHasher13

A hasher keyed by k0, k1.

Parameters

NameTypeNotesDescription
k0u64

First half of the 128-bit key. Kept so reset can re-derive the state without the caller passing the key again.

k1u64

Second half of the 128-bit key.

Returns: SipHasher13

new : (DefaultHasher) fn() -> SipHasher13

A hasher at FNV-1a's 64-bit offset basis (14695981039346656037). There is no keyed variant — FNV-1a has no key.

Returns: SipHasher13

reset : (DefaultHasher) fn(self : &mut SipHasher13) -> unit

Forget everything written so far, keeping the keys.

Parameters

NameTypeNotes
selfSipHasher13

Returns: unit

_round : (DefaultHasher) fn(self : &mut SipHasher13) -> unit

Parameters

NameTypeNotes
selfSipHasher13

Returns: unit

_compress : (DefaultHasher) fn(self : &mut SipHasher13, m : u64) -> unit

Absorb one full 8-byte block (little-endian value m).

Parameters

NameTypeNotes
selfSipHasher13
mu64

Returns: unit

_push_byte : (DefaultHasher) fn(self : &mut SipHasher13, b : u8) -> unit

Parameters

NameTypeNotes
selfSipHasher13
bu8

Returns: unit

write : (DefaultHasher) fn(self : &mut SipHasher13, buf : *(u8), size : usize) -> unit

Parameters

NameTypeNotes
selfSipHasher13
buf*(u8)
sizeusize

Returns: unit

write_u64 : (DefaultHasher) fn(self : &mut SipHasher13, v : u64) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vu64

Returns: unit

write_u8 : (DefaultHasher) fn(self : &mut SipHasher13, v : u8) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vu8

Returns: unit

write_u16 : (DefaultHasher) fn(self : &mut SipHasher13, v : u16) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vu16

Returns: unit

write_u32 : (DefaultHasher) fn(self : &mut SipHasher13, v : u32) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vu32

Returns: unit

write_usize : (DefaultHasher) fn(self : &mut SipHasher13, v : usize) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vusize

Returns: unit

write_i8 : (DefaultHasher) fn(self : &mut SipHasher13, v : i8) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vi8

Returns: unit

write_i16 : (DefaultHasher) fn(self : &mut SipHasher13, v : i16) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vi16

Returns: unit

write_i32 : (DefaultHasher) fn(self : &mut SipHasher13, v : i32) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vi32

Returns: unit

write_i64 : (DefaultHasher) fn(self : &mut SipHasher13, v : i64) -> unit

Parameters

NameTypeNotes
selfSipHasher13
vi64

Returns: unit

write_isize : (DefaultHasher) fn(self : &mut SipHasher13, v : isize) -> unit

Parameters

NameTypeNotes
selfSipHasher13
visize

Returns: unit

finish : (DefaultHasher) fn(self : &SipHasher13) -> u64

Parameters

NameTypeNotes
selfSipHasher13

Returns: u64

default : (DefaultHasher) fn() -> SipHasher13

Returns: SipHasher13

Functions

hash_one function
fn(generic(T : Type), value : &T, where(T <: Hash)) -> u64

Hash one value with DefaultHasher and the default keys.

h := hash_one(String.from("key"));
assert(hash_one(i32(1)) == hash_one(i32(1)), "deterministic");

Type Parameters

NameTypeNotes
TTypecomptime

Parameters

NameTypeNotes
value&T

Returns: u64

fn(generic(T : Type), value : &T, k0 : u64, k1 : u64, where(T <: Hash)) -> u64

Hash one value with DefaultHasher keyed by k0, k1 — what a HashMap.with_keys(k0, k1) computes for its keys.

Type Parameters

NameTypeNotes
TTypecomptime

Parameters

NameTypeNotesDescription
value&T
k0u64

First half of the 128-bit key. Kept so reset can re-derive the state without the caller passing the key again.

k1u64

Second half of the 128-bit key.

Returns: u64

Constants

DEFAULT_KEY_0 constant u64

The keys SipHasher13.new() (and therefore HashMap.new(), HashSet.new() and hash_one) start from. Fixed rather than random so a program's hash values — and the iteration order of its maps — are the same on every run; HashMap.with_keys opts a map into per-instance keys.

Value: 0

DEFAULT_KEY_1 constant u64

The second half of that fixed 128-bit key — see DEFAULT_KEY_0.

Value: 0