id="中国人"
首先,go语言hash:
Go
import (mmh3 "murmurhash3")
mmh3.Murmurhash3([]byte(id))
对应到Python hash编码,可以直接使用mmh3
python
import mmh3
mmh3.hash(id,signed=False)
其源码可以表示为
python
def sum32WithSeed(datas, seed=0):
c1_32 = 0xcc9e2d51
c2_32 = 0x1b873593
h1 = seed
datas_bytes = datas.encode('utf-8')
datas_bytes_len = len(datas_bytes)
if datas_bytes_len == 0:
return 0
nblocks = datas_bytes_len // 4
for id in range(datas_bytes_len):
if id % 4 != 0 or id + 4 > datas_bytes_len:
continue
k1 = int.from_bytes(datas_bytes[id:id + 4], byteorder='little', signed=False)
k1 *= c1_32
k1 &= 0xffffffff
k1 = (k1 << 15) | (k1 >> 17)
k1 *= c2_32
k1 &= 0xffffffff
h1 ^= k1
h1 = (h1 << 13) | (h1 >> 19)
h1 = h1 * 4 + h1 + 0xe6546b64
h1 &= 0xffffffff
tail = datas_bytes[nblocks * 4:]
tail_len = len(tail)
k1 = 0
for id in [3, 2, 1]:
if tail_len >= id and id == 3:
k1 ^= int.from_bytes(tail[2:3], byteorder='little', signed=False) << 16
if tail_len >= id and id == 2:
k1 ^= int.from_bytes(tail[1:2], byteorder='little', signed=False) << 8
if tail_len >= id and id == 1:
k1 ^= int.from_bytes(tail[0:1], byteorder='little', signed=False)
k1 *= c1_32
k1 &= 0xffffffff
k1 = (k1 << 15) | (k1 >> 17)
k1 *= c2_32
k1 &= 0xffffffff
h1 ^= k1
h1 &= 0xffffffff
h1 ^= datas_bytes_len
h1 ^= h1 >> 16
h1 *= 0x85ebca6b
h1 &= 0xffffffff
h1 ^= h1 >> 13
h1 *= 0xc2b2ae35
h1 &= 0xffffffff
h1 ^= h1 >> 16
return h1
def sum32(datas):
return sum32WithSeed(datas, 0)
print(sum32(id))