Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local _and32, _xor32 = bit32.band, bit32.bxor
- local _shl32, _shr32 = bit32.lshift, bit32.rshift
- local _byte = string.byte
- local function rol32(a, b)
- return _shl32(a, b) + _shr32(a, 32 - b)
- end
- local function modmul32(a, b)
- return _and32(
- _and32(a, 0xFFFF) * _and32(b, 0xFFFF) +
- _and32(_and32(a, 0xFFFF) * _and32(b, 0xFFFF0000), 0xFFFF0000) +
- _and32(_and32(a, 0xFFFF0000) * _and32(b, 0xFFFF), 0xFFFF0000),
- 0xFFFFFFFF)
- end
- local function modadd32(a, b)
- return _and32(
- a + b,
- 0xFFFFFFFF)
- end
- local function str2le4_x4(str, pos) -- this is where things become 1-based
- return
- _byte(str, pos + 1) + _shl32(_byte(str, pos + 2), 8) + _shl32(_byte(str, pos + 3), 16) + _shl32(_byte(str, pos + 4), 24),
- _byte(str, pos + 5) + _shl32(_byte(str, pos + 6), 8) + _shl32(_byte(str, pos + 7), 16) + _shl32(_byte(str, pos + 8), 24),
- _byte(str, pos + 9) + _shl32(_byte(str, pos + 10), 8) + _shl32(_byte(str, pos + 11), 16) + _shl32(_byte(str, pos + 12), 24),
- _byte(str, pos + 13) + _shl32(_byte(str, pos + 14), 8) + _shl32(_byte(str, pos + 15), 16) + _shl32(_byte(str, pos + 16), 24)
- end
- local function murmur3_mix(a)
- a = _xor32(a, _shr32(a, 16))
- a = modmul32(a, 0x85EBCA6B)
- a = _xor32(a, _shr32(a, 13))
- a = modmul32(a, 0xC2B2AE35)
- a = _xor32(a, _shr32(a, 16))
- return a
- end
- local c1, c2, c3, c4 = 0x239B961B, 0xAB0E9789, 0x38B34AE5, 0xA1E38B93;
- function hash(data, seed)
- local datalen = #data
- local nblocks_x16 = _and32(datalen, 0xFFFFFFF0)
- data = data .. ("\0"):rep(0x10)
- local h1, h2, h3, h4 = seed, seed, seed, seed
- for ix = 0, nblocks_x16 - 16, 16 do
- local k1, k2, k3, k4 = str2le4_x4(data, ix)
- k1 = modmul32(k1, c1); k1 = rol32(k1, 15); k1 = modmul32(k1, c2); h1 = _xor32(h1, k1)
- h1 = rol32(h1, 19); h1 = modadd32(h1, h2); h1 = modadd32(modmul32(h1, 5), 0x561CCD1B)
- k2 = modmul32(k2, c2); k2 = rol32(k2, 16); k2 = modmul32(k2, c3); h2 = _xor32(h2, k2)
- h2 = rol32(h2, 17); h2 = modadd32(h2, h3); h2 = modadd32(modmul32(h2, 5), 0x0BCAA747)
- k3 = modmul32(k3, c3); k3 = rol32(k3, 17); k3 = modmul32(k3, c4); h3 = _xor32(h3, k3)
- h3 = rol32(h3, 15); h3 = modadd32(h3, h4); h3 = modadd32(modmul32(h3, 5), 0x96CD1C35)
- k4 = modmul32(k4, c4); k4 = rol32(k4, 18); k4 = modmul32(k4, c1); h4 = _xor32(h4, k4)
- h4 = rol32(h4, 13); h4 = modadd32(h4, h1); h4 = modadd32(modmul32(h4, 5), 0x32AC3B17)
- end
- local k1, k2, k3, k4 = str2le4_x4(data, nblocks_x16)
- k1 = modmul32(k1, c1); k1 = rol32(k1, 15); k1 = modmul32(k1, c2); h1 = _xor32(h1, k1)
- k2 = modmul32(k2, c2); k2 = rol32(k2, 16); k2 = modmul32(k2, c3); h2 = _xor32(h2, k2)
- k3 = modmul32(k3, c3); k3 = rol32(k3, 17); k3 = modmul32(k3, c4); h3 = _xor32(h3, k3)
- k4 = modmul32(k4, c4); k4 = rol32(k4, 18); k4 = modmul32(k4, c1); h4 = _xor32(h4, k4)
- h1, h2, h3, h4 = _xor32(h1, datalen), _xor32(h2, datalen), _xor32(h3, datalen), _xor32(h4, datalen)
- h1 = modadd32(h1, h2); h1 = modadd32(h1, h3); h1 = modadd32(h1, h4)
- h2 = modadd32(h2, h1); h3 = modadd32(h3, h1); h4 = modadd32(h4, h1)
- h1, h2, h3, h4 = murmur3_mix(h1), murmur3_mix(h2), murmur3_mix(h3), murmur3_mix(h4)
- h1 = modadd32(h1, h2); h1 = modadd32(h1, h3); h1 = modadd32(h1, h4)
- h2 = modadd32(h2, h1); h3 = modadd32(h3, h1); h4 = modadd32(h4, h1)
- return h1, h2, h3, h4
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement