1 use ahash::{AHasher, RandomState};
2 use std::hash::{BuildHasher, Hash, Hasher};
3 
4 #[macro_use]
5 extern crate no_panic;
6 
7 #[inline(never)]
8 #[no_panic]
hash_test_final(num: i32, string: &str) -> (u64, u64)9 fn hash_test_final(num: i32, string: &str) -> (u64, u64) {
10     use core::hash::Hasher;
11     let mut hasher1 = RandomState::with_seeds(1, 2, 3, 4).build_hasher();
12     let mut hasher2 = RandomState::with_seeds(3, 4, 5, 6).build_hasher();
13     hasher1.write_i32(num);
14     hasher2.write(string.as_bytes());
15     (hasher1.finish(), hasher2.finish())
16 }
17 
18 #[inline(never)]
hash_test_final_wrapper(num: i32, string: &str)19 fn hash_test_final_wrapper(num: i32, string: &str) {
20     hash_test_final(num, string);
21 }
22 
23 struct SimpleBuildHasher {
24     hasher: AHasher,
25 }
26 
27 impl SimpleBuildHasher {
hash_one<T: Hash>(&self, x: T) -> u64 where Self: Sized,28     fn hash_one<T: Hash>(&self, x: T) -> u64
29     where
30         Self: Sized,
31     {
32         let mut hasher = self.build_hasher();
33         x.hash(&mut hasher);
34         hasher.finish()
35     }
36 }
37 
38 impl BuildHasher for SimpleBuildHasher {
39     type Hasher = AHasher;
40 
build_hasher(&self) -> Self::Hasher41     fn build_hasher(&self) -> Self::Hasher {
42         self.hasher.clone()
43     }
44 }
45 
46 #[inline(never)]
47 #[no_panic]
hash_test_specialize(num: i32, string: &str) -> (u64, u64)48 fn hash_test_specialize(num: i32, string: &str) -> (u64, u64) {
49     let hasher1 = RandomState::with_seeds(1, 2, 3, 4).build_hasher();
50     let hasher2 = RandomState::with_seeds(1, 2, 3, 4).build_hasher();
51     (
52         SimpleBuildHasher { hasher: hasher1 }.hash_one(num),
53         SimpleBuildHasher { hasher: hasher2 }.hash_one(string.as_bytes()),
54     )
55 }
56 
57 #[inline(never)]
hash_test_random_wrapper(num: i32, string: &str)58 fn hash_test_random_wrapper(num: i32, string: &str) {
59     hash_test_specialize(num, string);
60 }
61 
62 #[inline(never)]
63 #[no_panic]
hash_test_random(num: i32, string: &str) -> (u64, u64)64 fn hash_test_random(num: i32, string: &str) -> (u64, u64) {
65     let build_hasher1 = RandomState::with_seeds(1, 2, 3, 4);
66     let build_hasher2 = RandomState::with_seeds(1, 2, 3, 4);
67     (build_hasher1.hash_one(&num), build_hasher2.hash_one(string.as_bytes()))
68 }
69 
70 #[inline(never)]
hash_test_specialize_wrapper(num: i32, string: &str)71 fn hash_test_specialize_wrapper(num: i32, string: &str) {
72     hash_test_specialize(num, string);
73 }
74 
75 #[test]
test_no_panic()76 fn test_no_panic() {
77     hash_test_final_wrapper(2, "Foo");
78     hash_test_specialize_wrapper(2, "Bar");
79     hash_test_random(2, "Baz");
80     hash_test_random_wrapper(2, "Bat");
81 }
82