Skip to main content

RandomState

Struct RandomState 

Source
pub struct RandomState<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> { /* private fields */ }
Expand description

A [std::hash::RandomState] compatible hasher that initializes a RapidHasher with a random seed and random global secrets.

This is designed to provide some HashDoS resistance by using a random seed per hashmap, and a global random set of secrets.

§Portability

On most target platforms, the secrets are randomly initialized once and cached globally for the lifetime of the program using a mix of ASLR and other entropy sources. The seed is randomly initialized for each new instance of RandomState using only ASLR and a mixing step.

On targets without atomic pointer support, the global secrets will not be randomized, and instead will fall back to the default secrets. This means these platforms will not have minimal HashDoS resistance guarantees. If this is important for your application, please raise a GitHub issue to improve support for these platforms.

§Example

use std::collections::HashMap;
use std::hash::Hasher;

use rapidhash::quality::RandomState;

let mut map = HashMap::with_hasher(RandomState::default());
map.insert(42, "the answer");

Implementations§

Source§

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

Source

pub fn new() -> Self

Create a new random state with a random seed.

The seed is always randomized by using ASLR on every new instance of RandomState.

With the rand feature enabled, the secrets will be randomized using [rand::random]. Otherwise, a mix of ASLR and some other poorer sources of entropy will be mixed together to generate the secrets. The secrets are statically cached for the lifetime of the program after their initial generation.

On platforms that do not support atomic pointers, the secrets will be the default rapidhash secrets, which are not randomized. Therefore, targets without atomic pointer support will not have minimal HashDoS resistance guarantees.

Trait Implementations§

Source§

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> BuildHasher for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

Source§

type Hasher = RapidHasher<'static, AVALANCHE, SPONGE, COMPACT, PROTECTED>

Type of the hasher that will be created.
Source§

fn build_hasher(&self) -> Self::Hasher

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<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> Clone for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

Source§

fn clone(&self) -> RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

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<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> Copy for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

Source§

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> Debug for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

Source§

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

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

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> Default for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

Warning that RandomState only randomizes the seed on platforms that support atomic pointers.

Source§

fn default() -> Self

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

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> Eq for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

Source§

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> PartialEq for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

Source§

fn eq(&self, other: &RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> StructuralPartialEq for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

Auto Trait Implementations§

§

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> Freeze for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

§

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> RefUnwindSafe for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

§

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> Send for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

§

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> Sync for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

§

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> Unpin for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

§

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> UnsafeUnpin for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

§

impl<const AVALANCHE: bool, const SPONGE: bool, const COMPACT: bool, const PROTECTED: bool> UnwindSafe for RandomState<AVALANCHE, SPONGE, COMPACT, PROTECTED>

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