pub use hashbrown::hash_map;
mod hashbrown_tables {
#[cfg(feature = "std")]
mod hasher {
pub use std::collections::hash_map::RandomState;
}
#[cfg(not(feature = "std"))]
mod hasher {
#![allow(deprecated)] use core::hash::{BuildHasher, SipHasher};
#[derive(Clone, Copy)]
pub struct RandomState {
k0: u64,
k1: u64,
}
impl RandomState {
pub fn new() -> RandomState {
let (k0, k1);
#[cfg(not(fuzzing))]
{
let mut keys = [0; 16];
possiblyrandom::getpossiblyrandom(&mut keys);
let mut k0_bytes = [0; 8];
let mut k1_bytes = [0; 8];
k0_bytes.copy_from_slice(&keys[..8]);
k1_bytes.copy_from_slice(&keys[8..]);
k0 = u64::from_le_bytes(k0_bytes);
k1 = u64::from_le_bytes(k1_bytes);
}
#[cfg(fuzzing)]
{
k0 = 0;
k1 = 0;
}
RandomState { k0, k1 }
}
}
impl Default for RandomState {
fn default() -> RandomState {
RandomState::new()
}
}
impl BuildHasher for RandomState {
type Hasher = SipHasher;
fn build_hasher(&self) -> SipHasher {
SipHasher::new_with_keys(self.k0, self.k1)
}
}
}
pub use hasher::*;
pub type HashMap<K, V> = hashbrown::HashMap<K, V, RandomState>;
pub type HashSet<K> = hashbrown::HashSet<K, RandomState>;
pub(crate) type OccupiedHashMapEntry<'a, K, V> =
hashbrown::hash_map::OccupiedEntry<'a, K, V, RandomState>;
pub(crate) type VacantHashMapEntry<'a, K, V> =
hashbrown::hash_map::VacantEntry<'a, K, V, RandomState>;
pub fn new_hash_map<K, V>() -> HashMap<K, V> {
HashMap::with_hasher(RandomState::new())
}
pub fn hash_map_with_capacity<K, V>(cap: usize) -> HashMap<K, V> {
HashMap::with_capacity_and_hasher(cap, RandomState::new())
}
pub(crate) fn hash_map_from_iter<
K: core::hash::Hash + Eq,
V,
I: IntoIterator<Item = (K, V)>,
>(
iter: I,
) -> HashMap<K, V> {
let iter = iter.into_iter();
let min_size = iter.size_hint().0;
let mut res = HashMap::with_capacity_and_hasher(min_size, RandomState::new());
res.extend(iter);
res
}
pub fn new_hash_set<K>() -> HashSet<K> {
HashSet::with_hasher(RandomState::new())
}
pub(crate) fn hash_set_with_capacity<K>(cap: usize) -> HashSet<K> {
HashSet::with_capacity_and_hasher(cap, RandomState::new())
}
pub(crate) fn hash_set_from_iter<K: core::hash::Hash + Eq, I: IntoIterator<Item = K>>(
iter: I,
) -> HashSet<K> {
let iter = iter.into_iter();
let min_size = iter.size_hint().0;
let mut res = HashSet::with_capacity_and_hasher(min_size, RandomState::new());
res.extend(iter);
res
}
}
pub use hashbrown_tables::*;