1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use std::hash::{BuildHasher, Hash, Hasher};
pub fn flatten<T: Clone, R: AsRef<[T]>>(bufs: &[R], len: Option<usize>) -> Vec<T> {
let len = len.unwrap_or_else(|| bufs.iter().map(|b| b.as_ref().len()).sum());
let mut out = Vec::with_capacity(len);
for b in bufs {
out.extend_from_slice(b.as_ref());
}
out
}
#[inline]
pub fn hash_to_partition(h: u64, n_partitions: usize) -> usize {
debug_assert!(n_partitions.is_power_of_two());
h as usize & n_partitions.wrapping_sub(1)
}
#[inline]
pub fn get_hash<T: Hash, B: BuildHasher>(value: T, hb: &B) -> u64 {
let mut hasher = hb.build_hasher();
value.hash(&mut hasher);
hasher.finish()
}