首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有MurmurHash的纯python实现?

有没有MurmurHash的纯python实现?
EN

Stack Overflow用户
提问于 2012-11-09 17:28:06
回答 5查看 14.1K关注 0票数 23

我需要(也找不到)一个纯python (没有c++)的MurmurHash实现,而且我太新手了,不会自己写。速度或内存使用对我的项目来说并不重要。

我找到了一个尝试here,但它被限制为31位哈希,我真的需要一个64位哈希。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-02-27 22:27:59

MurmurHash3的另一个纯python实现,它完全兼容并可由mmh3包装器替换,但仍限于32位Murmur3:https://github.com/wc-duck/pymmh3

票数 6
EN

Stack Overflow用户

发布于 2013-04-02 09:50:12

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

代码语言:javascript
复制
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
票数 10
EN

Stack Overflow用户

发布于 2015-01-29 13:51:29

修复Nikolas版本中的错误

代码语言:javascript
复制
def bytes_to_long(bytes):
    assert len(bytes) == 8
    return sum((b << (k * 8) for k, b in enumerate(bytes)))


def murmur64(data, seed = 19820125):

    m = 0xc6a4a7935bd1e995
    r = 47

    MASK = 2 ** 64 - 1

    data_as_bytes = bytearray(data)

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

    off = len(data_as_bytes)/8*8
    for ll in range(0, off, 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[off+6] << 48))

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

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

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

    if l >= 3:
        h = (h ^ (data_as_bytes[off+2] << 16))

    if l >= 2:
        h = (h ^ (data_as_bytes[off+1] << 8))

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

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

    return h
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13305290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档