ajour_core/
murmur2.rs

1// This code is from: https://github.com/camas/grunt/
2const MURMUR2_CONST: u32 = 1_540_483_477;
3
4pub(crate) fn calculate_hash(data: &[u8], seed: u32) -> u32 {
5    let length = data.len();
6    let mut h: u32 = seed ^ length as u32;
7    let mut i: u32 = 0;
8    let mut shift: i32 = 0;
9    for b in data.iter() {
10        i |= (*b as u32) << shift;
11        shift += 8;
12        if shift == 32 {
13            i = i.wrapping_mul(MURMUR2_CONST);
14            i ^= i >> 24;
15            i = i.wrapping_mul(MURMUR2_CONST);
16            h = h.wrapping_mul(MURMUR2_CONST);
17            h ^= i;
18            i = 0;
19            shift = 0;
20        }
21    }
22    if shift > 0 {
23        h ^= i;
24        h = h.wrapping_mul(MURMUR2_CONST);
25    }
26    h ^= h >> 13;
27    h = h.wrapping_mul(MURMUR2_CONST);
28    h ^ h >> 15
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34
35    #[test]
36    fn test_hash() {
37        // Tests known result
38        let data = b"##Interface:80300##Title:|cff00ff00TradeSkillMaster_AppHelper|r##Notes:ActsasaconnectionbetweentheTSMaddonandapp.##Author:TSMTeam##Version:v4.0.8##SavedVariables:TradeSkillMaster_AppHelperDB##Dependency:TradeSkillMasterTradeSkillMaster_AppHelper.luaAppData.lua";
39        let res = calculate_hash(data, 1);
40        assert_eq!(res, 851_628_572);
41    }
42}