Advertisement
LBPHacker

MurmurHash3 128-bit (x86) for CC

Jul 6th, 2016
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.24 KB | None | 0 0
  1. local _and32, _xor32 = bit32.band, bit32.bxor
  2. local _shl32, _shr32 = bit32.lshift, bit32.rshift
  3. local _byte = string.byte
  4.  
  5. local function rol32(a, b)
  6.     return _shl32(a, b) + _shr32(a, 32 - b)
  7. end
  8.  
  9. local function modmul32(a, b)
  10.     return _and32(
  11.         _and32(a, 0xFFFF) * _and32(b, 0xFFFF) +
  12.         _and32(_and32(a, 0xFFFF) * _and32(b, 0xFFFF0000), 0xFFFF0000) +
  13.         _and32(_and32(a, 0xFFFF0000) * _and32(b, 0xFFFF), 0xFFFF0000),
  14.     0xFFFFFFFF)
  15. end
  16.  
  17. local function modadd32(a, b)
  18.     return _and32(
  19.         a + b,
  20.     0xFFFFFFFF)
  21. end
  22.  
  23. local function str2le4_x4(str, pos) -- this is where things become 1-based
  24.     return
  25.         _byte(str, pos +  1) + _shl32(_byte(str, pos +  2), 8) + _shl32(_byte(str, pos +  3), 16) + _shl32(_byte(str, pos +  4), 24),
  26.         _byte(str, pos +  5) + _shl32(_byte(str, pos +  6), 8) + _shl32(_byte(str, pos +  7), 16) + _shl32(_byte(str, pos +  8), 24),
  27.         _byte(str, pos +  9) + _shl32(_byte(str, pos + 10), 8) + _shl32(_byte(str, pos + 11), 16) + _shl32(_byte(str, pos + 12), 24),
  28.         _byte(str, pos + 13) + _shl32(_byte(str, pos + 14), 8) + _shl32(_byte(str, pos + 15), 16) + _shl32(_byte(str, pos + 16), 24)
  29. end
  30.  
  31. local function murmur3_mix(a)
  32.     a = _xor32(a, _shr32(a, 16))
  33.     a = modmul32(a, 0x85EBCA6B)
  34.     a = _xor32(a, _shr32(a, 13))
  35.     a = modmul32(a, 0xC2B2AE35)
  36.     a = _xor32(a, _shr32(a, 16))
  37.     return a
  38. end
  39.  
  40. local c1, c2, c3, c4 = 0x239B961B, 0xAB0E9789, 0x38B34AE5, 0xA1E38B93;
  41. function hash(data, seed)
  42.     local datalen = #data
  43.     local nblocks_x16 = _and32(datalen, 0xFFFFFFF0)
  44.     data = data .. ("\0"):rep(0x10)
  45.    
  46.     local h1, h2, h3, h4 = seed, seed, seed, seed
  47.     for ix = 0, nblocks_x16 - 16, 16 do
  48.         local k1, k2, k3, k4 = str2le4_x4(data, ix)
  49.         k1 = modmul32(k1, c1); k1 = rol32(k1, 15); k1 = modmul32(k1, c2); h1 = _xor32(h1, k1)
  50.         h1 = rol32(h1, 19); h1 = modadd32(h1, h2); h1 = modadd32(modmul32(h1, 5), 0x561CCD1B)
  51.         k2 = modmul32(k2, c2); k2 = rol32(k2, 16); k2 = modmul32(k2, c3); h2 = _xor32(h2, k2)
  52.         h2 = rol32(h2, 17); h2 = modadd32(h2, h3); h2 = modadd32(modmul32(h2, 5), 0x0BCAA747)
  53.         k3 = modmul32(k3, c3); k3 = rol32(k3, 17); k3 = modmul32(k3, c4); h3 = _xor32(h3, k3)
  54.         h3 = rol32(h3, 15); h3 = modadd32(h3, h4); h3 = modadd32(modmul32(h3, 5), 0x96CD1C35)
  55.         k4 = modmul32(k4, c4); k4 = rol32(k4, 18); k4 = modmul32(k4, c1); h4 = _xor32(h4, k4)
  56.         h4 = rol32(h4, 13); h4 = modadd32(h4, h1); h4 = modadd32(modmul32(h4, 5), 0x32AC3B17)
  57.     end
  58.    
  59.     local k1, k2, k3, k4 = str2le4_x4(data, nblocks_x16)
  60.     k1 = modmul32(k1, c1); k1 = rol32(k1, 15); k1 = modmul32(k1, c2); h1 = _xor32(h1, k1)
  61.     k2 = modmul32(k2, c2); k2 = rol32(k2, 16); k2 = modmul32(k2, c3); h2 = _xor32(h2, k2)
  62.     k3 = modmul32(k3, c3); k3 = rol32(k3, 17); k3 = modmul32(k3, c4); h3 = _xor32(h3, k3)
  63.     k4 = modmul32(k4, c4); k4 = rol32(k4, 18); k4 = modmul32(k4, c1); h4 = _xor32(h4, k4)
  64.    
  65.     h1, h2, h3, h4 = _xor32(h1, datalen), _xor32(h2, datalen), _xor32(h3, datalen), _xor32(h4, datalen)
  66.    
  67.     h1 = modadd32(h1, h2); h1 = modadd32(h1, h3); h1 = modadd32(h1, h4)
  68.     h2 = modadd32(h2, h1); h3 = modadd32(h3, h1); h4 = modadd32(h4, h1)
  69.    
  70.     h1, h2, h3, h4 = murmur3_mix(h1), murmur3_mix(h2), murmur3_mix(h3), murmur3_mix(h4)
  71.    
  72.     h1 = modadd32(h1, h2); h1 = modadd32(h1, h3); h1 = modadd32(h1, h4)
  73.     h2 = modadd32(h2, h1); h3 = modadd32(h3, h1); h4 = modadd32(h4, h1)
  74.    
  75.     return h1, h2, h3, h4
  76. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement