1const 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 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}