1pub fn hash(s: &str) -> u32 {
2 let mut h = s.len() as u32;
4 let mut a: u32;
5 let mut b: u32;
6 let len = s.len();
7 let s = s.as_ptr();
8 unsafe {
9 match len {
10 0 => return 0,
11 1..=3 => {
12 a = *s as _;
13 h ^= *s.add(len - 1) as u32;
14 b = *s.add(len >> 1) as _;
15 h ^= b;
16 h = h.wrapping_sub(b.rotate_left(14));
17 }
18 _ => {
19 a = s.cast::<u32>().read_unaligned();
20 h ^= s.add(len - 4).cast::<u32>().read_unaligned();
21 b = s
22 .add((len >> 1).wrapping_sub(2))
23 .cast::<u32>()
24 .read_unaligned();
25 h ^= b;
26 h = h.wrapping_sub(b.rotate_left(14));
27 b += s
28 .add((len >> 2).wrapping_sub(1))
29 .cast::<u32>()
30 .read_unaligned();
31 }
32 }
33 }
34 a ^= h;
35 a = a.wrapping_sub(h.rotate_left(11));
36 b ^= a;
37 b = b.wrapping_sub(a.rotate_left(25));
38 h ^= b;
39 h = h.wrapping_sub(b.rotate_left(16));
40 h
41}