Source code for nlpstack.common.hashutil
import hashlib
import io
from typing import Any
import dill
[docs]def hash_object(o: Any) -> int:
m = hashlib.blake2b()
with io.BytesIO() as buffer:
dill.dump(o, buffer)
m.update(buffer.getbuffer())
return int.from_bytes(m.digest(), "big")
[docs]def murmurhash3(key: str, seed: int = 0) -> int:
length = len(key)
remainder = length & 3
n = length - remainder
h1 = seed
c1 = 0xCC9E2D51
c2 = 0x1B873593
i = 0
while i < n:
k1 = (
(ord(key[i]) & 0xFF)
| ((ord(key[i + 1]) & 0xFF) << 8)
| (ord(key[i + 2]) & 0xFF) << 16
| (ord(key[i + 3]) & 0xFF) << 24
)
i += 4
k1 = ((((k1 & 0xFFFF) * c1) + ((((k1 >> 16) * c1) & 0xFFFF) << 16))) & 0xFFFFFFFF
k1 = (k1 << 15) | (k1 >> 17)
k1 = ((((k1 & 0xFFFF) * c2) + ((((k1 >> 16) * c2) & 0xFFFF) << 16))) & 0xFFFFFFFF
h1 ^= k1
h1 = (h1 << 13) | (h1 >> 19)
h1b = ((((h1 & 0xFFFF) * 5) + ((((h1 >> 16) * 5) & 0xFFFF) << 16))) & 0xFFFFFFFF
h1 = ((h1b & 0xFFFF) + 0x6B64) + ((((h1b >> 16) + 0xE654) & 0xFFFF) << 16)
k1 = 0
if remainder == 3:
k1 ^= (ord(key[i + 2]) & 0xFF) << 16
k1 ^= (ord(key[i + 1]) & 0xFF) << 8
k1 ^= ord(key[i]) & 0xFF
elif remainder == 2:
k1 ^= (ord(key[i + 1]) & 0xFF) << 8
k1 ^= ord(key[i]) & 0xFF
elif remainder == 1:
k1 ^= ord(key[i]) & 0xFF
k1 = ((((k1 & 0xFFFF) * c1) + ((((k1 >> 16) * c1) & 0xFFFF) << 16))) & 0xFFFFFFFF
k1 = (k1 << 15) | (k1 >> 17)
k1 = ((((k1 & 0xFFFF) * c2) + ((((k1 >> 16) * c2) & 0xFFFF) << 16))) & 0xFFFFFFFF
h1 ^= k1
h1 ^= length
h1 ^= h1 >> 16
h1 = ((((h1 & 0xFFFF) * 0x85EBCA6B) + ((((h1 >> 16) * 0x85EBCA6B) & 0xFFFF) << 16))) & 0xFFFFFFFF
h1 ^= h1 >> 13
h1 = ((((h1 & 0xFFFF) * 0xC2B2AE35) + ((((h1 >> 16) * 0xC2B2AE35) & 0xFFFF) << 16))) & 0xFFFFFFFF
h1 ^= h1 >> 16
return h1 >> 0