summaryrefslogtreecommitdiffstats
path: root/third_party/rust/ahash/tests/map_tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/ahash/tests/map_tests.rs')
-rw-r--r--third_party/rust/ahash/tests/map_tests.rs115
1 files changed, 111 insertions, 4 deletions
diff --git a/third_party/rust/ahash/tests/map_tests.rs b/third_party/rust/ahash/tests/map_tests.rs
index be617a2e72..97fdbee0f9 100644
--- a/third_party/rust/ahash/tests/map_tests.rs
+++ b/third_party/rust/ahash/tests/map_tests.rs
@@ -1,10 +1,11 @@
+#![cfg_attr(feature = "specialize", feature(build_hasher_simple_hash_one))]
+
use std::hash::{BuildHasher, Hash, Hasher};
+use ahash::RandomState;
use criterion::*;
use fxhash::FxHasher;
-use ahash::{AHasher, CallHasher, RandomState};
-
fn gen_word_pairs() -> Vec<String> {
let words: Vec<_> = r#"
a, ability, able, about, above, accept, according, account, across, act, action,
@@ -150,9 +151,18 @@ fn check_for_collisions<H: Hash, B: BuildHasher>(build_hasher: &B, items: &[H],
);
}
+#[cfg(feature = "specialize")]
+#[allow(unused)] // False positive
+fn hash<H: Hash, B: BuildHasher>(b: &H, build_hasher: &B) -> u64 {
+ build_hasher.hash_one(b)
+}
+
+#[cfg(not(feature = "specialize"))]
#[allow(unused)] // False positive
fn hash<H: Hash, B: BuildHasher>(b: &H, build_hasher: &B) -> u64 {
- H::get_hash(b, build_hasher)
+ let mut hasher = build_hasher.build_hasher();
+ b.hash(&mut hasher);
+ hasher.finish()
}
#[test]
@@ -169,10 +179,107 @@ fn test_bucket_distribution() {
check_for_collisions(&build_hasher, &sequence, 256);
}
+#[cfg(feature = "std")]
+#[test]
+fn test_ahash_alias_map_construction() {
+ let mut map = ahash::HashMap::default();
+ map.insert(1, "test");
+ use ahash::HashMapExt;
+ let mut map = ahash::HashMap::with_capacity(1234);
+ map.insert(1, "test");
+}
+
+#[cfg(feature = "std")]
+#[test]
+fn test_ahash_alias_set_construction() {
+ let mut set = ahash::HashSet::default();
+ set.insert(1);
+
+ use ahash::HashSetExt;
+ let mut set = ahash::HashSet::with_capacity(1235);
+ set.insert(1);
+}
+
+
+#[cfg(feature = "std")]
+#[test]
+fn test_key_ref() {
+ let mut map = ahash::HashMap::default();
+ map.insert(1, "test");
+ assert_eq!(Some((1, "test")), map.remove_entry(&1));
+
+ let mut map = ahash::HashMap::default();
+ map.insert(&1, "test");
+ assert_eq!(Some((&1, "test")), map.remove_entry(&&1));
+
+ let mut m = ahash::HashSet::<Box<String>>::default();
+ m.insert(Box::from("hello".to_string()));
+ assert!(m.contains(&"hello".to_string()));
+
+ let mut m = ahash::HashSet::<String>::default();
+ m.insert("hello".to_string());
+ assert!(m.contains("hello"));
+
+ let mut m = ahash::HashSet::<Box<[u8]>>::default();
+ m.insert(Box::from(&b"hello"[..]));
+ assert!(m.contains(&b"hello"[..]));
+}
+
+#[cfg(feature = "std")]
+#[test]
+fn test_byte_dist() {
+ use rand::{SeedableRng, Rng, RngCore};
+ use pcg_mwc::Mwc256XXA64;
+
+ let mut r = Mwc256XXA64::seed_from_u64(0xe786_c22b_119c_1479);
+ let mut lowest = 2.541;
+ let mut highest = 2.541;
+ for _round in 0..100 {
+ let mut table: [bool; 256 * 8] = [false; 256 * 8];
+ let hasher = RandomState::with_seeds(r.gen(), r.gen(), r.gen(), r.gen());
+ for i in 0..128 {
+ let mut keys: [u8; 8] = hasher.hash_one((i as u64) << 30).to_ne_bytes();
+ //let mut keys = r.next_u64().to_ne_bytes(); //This is a control to test assert sensitivity.
+ for idx in 0..8 {
+ while table[idx * 256 + keys[idx] as usize] {
+ keys[idx] = keys[idx].wrapping_add(1);
+ }
+ table[idx * 256 + keys[idx] as usize] = true;
+ }
+ }
+
+ for idx in 0..8 {
+ let mut len = 0;
+ let mut total_len = 0;
+ let mut num_seq = 0;
+ for i in 0..256 {
+ if table[idx * 256 + i] {
+ len += 1;
+ } else if len != 0 {
+ num_seq += 1;
+ total_len += len;
+ len = 0;
+ }
+ }
+ let mean = total_len as f32 / num_seq as f32;
+ println!("Mean sequence length = {}", mean);
+ if mean > highest {
+ highest = mean;
+ }
+ if mean < lowest {
+ lowest = mean;
+ }
+ }
+ }
+ assert!(lowest > 1.9, "Lowest = {}", lowest);
+ assert!(highest < 3.9, "Highest = {}", highest);
+}
+
+
fn ahash_vec<H: Hash>(b: &Vec<H>) -> u64 {
let mut total: u64 = 0;
for item in b {
- let mut hasher = AHasher::new_with_keys(1234, 5678);
+ let mut hasher = RandomState::with_seeds(12, 34, 56, 78).build_hasher();
item.hash(&mut hasher);
total = total.wrapping_add(hasher.finish());
}