Skip to main content

ClientHashBuilder

Struct ClientHashBuilder 

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

A fast, seeded hasher for short keys.

The default HashMap hasher is SipHash-1-3, chosen for resistance to collision floods. That resistance is not optional here — the key is a client’s source address, which an attacker picks — but SipHash’s cost is out of proportion to a 4-to-17-byte key: with everything else in the client table fixed, callgrind still attributed ~32% of the server’s per-request instructions to hashing one address once.

So this keeps the property and drops the price. The seed is drawn from the OS once per process via RandomState, exactly as SipHash’s keys are, so an attacker cannot compute which addresses collide without first learning a secret they never see. What is given up is SipHash’s proof against an adversary who somehow does learn the seed; what is kept is the practical defence, on a table that is additionally bounded to a fixed capacity with LRU eviction, so even a successful collision attack cannot grow a chain without bound.

Trait Implementations§

Source§

impl BuildHasher for ClientHashBuilder

Source§

type Hasher = ClientHasher

Type of the hasher that will be created.
Source§

fn build_hasher(&self) -> ClientHasher

Creates a new hasher. Read more
1.71.0 · Source§

fn hash_one<T>(&self, x: T) -> u64
where T: Hash, Self: Sized, Self::Hasher: Hasher,

Calculates the hash of a single value. Read more
Source§

impl Clone for ClientHashBuilder

Source§

fn clone(&self) -> ClientHashBuilder

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 Copy for ClientHashBuilder

Source§

impl Default for ClientHashBuilder

Source§

fn default() -> Self

Returns the “default value” for a type. 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 = !

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.