gpt4 book ai didi

python - MurmurHash 有纯 python 实现吗?

转载 作者:IT老高 更新时间:2023-10-28 20:54:11 24 4
gpt4 key购买 nike

我需要(但找不到)MurmurHash 的纯 python(无 c++)实现,我太新手了,不能自己写。速度或内存使用对我的项目来说并不重要。

我找到了一个尝试 here ,但它仅限于 31 位散列,我真的需要 64 位散列。

注意:对于那些需要快速实现的人,有一个 MurmurHash2 库 here和一个 MurmurHash3 库 here

最佳答案

这是未经测试的(对不起!),但这是我想出的一个版本。Python 允许使用任意大的整数,因此我为前 8 个字节(或 64 位)创建了一个掩码,然后我将其(通过按位与)应用于所有可能产生大于 64 位整数的算术结果。也许其他人可以评论一般方法和可能的字节序问题等。

def bytes_to_long(bytes):
assert len(bytes) == 8
return sum((b << (k * 8) for k, b in enumerate(bytes)))


def murmur(data, seed):

m = 0xc6a4a7935bd1e995
r = 47

MASK = 2 ** 64 - 1

data_as_bytes = bytearray(data)

h = seed ^ ((m * len(data_as_bytes)) & MASK)

for ll in range(0, len(data_as_bytes), 8):
k = bytes_to_long(data_as_bytes[ll:ll + 8])
k = (k * m) & MASK
k = k ^ ((k >> r) & MASK)
k = (k * m) & MASK
h = (h ^ k)
h = (h * m) & MASK

l = len(data_as_bytes) & 7

if l >= 7:
h = (h ^ (data_as_bytes[6] << 48))

if l >= 6:
h = (h ^ (data_as_bytes[5] << 40))

if l >= 5:
h = (h ^ (data_as_bytes[4] << 32))

if l >= 4:
h = (h ^ (data_as_bytes[3] << 24))

if l >= 3:
h = (h ^ (data_as_bytes[4] << 16))

if l >= 2:
h = (h ^ (data_as_bytes[4] << 8))

if l >= 1:
h = (h ^ data_as_bytes[4])
h = (h * m) & MASK

h = h ^ ((h >> r) & MASK)
h = (h * m) & MASK
h = h ^ ((h >> r) & MASK)

return h

关于python - MurmurHash 有纯 python 实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13305290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com