Skip to main content

FastHasher

Struct FastHasher 

Source
pub struct FastHasher { /* private fields */ }
Expand description

Faster non-cryptographic hasher for small integer keys.

Intended to replace and outperform the default SipHash hasher for small keys used in puzzles. It should not be used in cryptographic or sensitive contexts and is vulnerable to HashDoS attacks.

Integer writes smaller than 64 bits are packed into a pending u64, so a key such as (u32, u16, u16) hashes like the manually packed value (a << 32) | (b << 16) | c.

The mixing step is inspired by wyhash. It uses XOR to mix the current state and value, then does a 128bit multiplication with a large constant, before XOR-ing the high and low 64bit halves.

The branches should be optimized out for fixed-sized types in release builds. Example x86 assembly for u64:

movabsq $SEED,%rax
xorq    %rdi,%rax
movabsq $MUL,%rcx
mulq    %rcx
xorq    %rdx,%rax
retq

Example x86 assembly for (u32, u16, u16), showing bit packing followed by the same fold:

shlq    $32,%rdi
shll    $16,%esi
leaq    (%rsi,%rdi),%rax
movzwl  %dx,%ecx
orq     %rax,%rcx
movabsq $SEED,%rax
xorq    %rcx,%rax
movabsq $MUL,%rcx
mulq    %rcx
xorq    %rdx,%rax
retq

Trait Implementations§

Source§

impl Clone for FastHasher

Source§

fn clone(&self) -> FastHasher

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FastHasher

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FastHasher

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Hasher for FastHasher

Source§

fn finish(&self) -> u64

Returns the hash value for the values written so far. Read more
Source§

fn write(&mut self, bytes: &[u8])

Writes some data into this Hasher. Read more
Source§

fn write_u8(&mut self, n: u8)

Writes a single u8 into this hasher.
Source§

fn write_u16(&mut self, n: u16)

Writes a single u16 into this hasher.
Source§

fn write_u32(&mut self, n: u32)

Writes a single u32 into this hasher.
Source§

fn write_u64(&mut self, n: u64)

Writes a single u64 into this hasher.
Source§

fn write_u128(&mut self, n: u128)

Writes a single u128 into this hasher.
Source§

fn write_usize(&mut self, n: usize)

Writes a single usize into this hasher.
1.3.0 · Source§

fn write_i8(&mut self, i: i8)

Writes a single i8 into this hasher.
1.3.0 · Source§

fn write_i16(&mut self, i: i16)

Writes a single i16 into this hasher.
1.3.0 · Source§

fn write_i32(&mut self, i: i32)

Writes a single i32 into this hasher.
1.3.0 · Source§

fn write_i64(&mut self, i: i64)

Writes a single i64 into this hasher.
1.26.0 · Source§

fn write_i128(&mut self, i: i128)

Writes a single i128 into this hasher.
1.3.0 · Source§

fn write_isize(&mut self, i: isize)

Writes a single isize into this hasher.
Source§

fn write_length_prefix(&mut self, len: usize)

🔬This is a nightly-only experimental API. (hasher_prefixfree_extras)
Writes a length prefix into this hasher, as part of being prefix-free. Read more
Source§

fn write_str(&mut self, s: &str)

🔬This is a nightly-only experimental API. (hasher_prefixfree_extras)
Writes a single str into this hasher. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.