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