tlua/
util.rs

1pub fn hash(s: &str) -> u32 {
2    // https://github.com/LuaJIT/LuaJIT/blob/1d7b5029c5ba36870d25c67524034d452b761d27/src/lj_str.c#L76
3    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}