卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34809本站已运行393

Go 和 Python 之间的 Murmur3 哈希兼容性

go 和 python 之间的 murmur3 哈希兼容性

php小编子墨为您介绍Go和Python之间的Murmur3哈希兼容性。Murmur3是一种高效的哈希算法,常用于数据结构和算法中的散列操作。在Go和Python这两种编程语言中,Murmur3哈希算法的实现方式有所不同,因此在使用时可能会出现兼容性问题。本文将详细介绍Go和Python中Murmur3哈希算法的差异,并提供解决方案,以确保在不同语言之间的数据传递中保持正确的哈希兼容性。

问题内容

我们有两个不同的库,一个在 python 中,一个在 go 中,需要以相同的方式计算 murmur3 哈希值。不幸的是,无论我们如何努力,我们都无法让库产生相同的结果。从这个关于 java 和 python 的问题来看,兼容性不一定是直接的。

现在我们正在使用 python mmh3 和 go github.com/spaolacci/murmur3 库。

在 go 中:

hash := murmur3.new128()
hash.write([]byte("chocolate-covered-espresso-beans"))
fmt.println(base64.rawurlencoding.encodetostring(hash.sum(nil)))
// output: clhso2ncbxyoezvilm5gwg

在python中:

name = "chocolate-covered-espresso-beans"
hash = mmh3.hash128(name.encode('utf-8'), signed=False).to_bytes(16, byteorder='big', signed=False)
print(base64.urlsafe_b64encode(hash).decode('utf-8').strip("="))
# Output: jns74izOYMJwsdKjacIHHA (big byteorder)

hash = mmh3.hash128(name.encode('utf-8'), signed=False).to_bytes(16, byteorder='little', signed=False)
print(base64.urlsafe_b64encode(hash).decode('utf-8').strip("="))
# Output: HAfCaaPSsXDCYM4s4jt7jg (little byteorder)

hash = mmh3.hash_bytes(name.encode('utf-8'))
print(base64.urlsafe_b64encode(hash).decode('utf-8').strip("="))
# Output: HAfCaaPSsXDCYM4s4jt7jg

在go中,murmur3返回一个uint64,所以我们假设python中的signed=false;但是我们也尝试了 signed=true 并没有获得匹配的哈希值。

我们对不同的库持开放态度,但想知道我们从字符串计算 base64 编码哈希的 go 或 python 方法是否存在问题。任何帮助表示赞赏。

解决方法

第一个 python 结果几乎是正确的。

>>> binascii.hexlify(base64.b64decode('jns74izoymjwsdkjacihha=='))
b'8e7b3be22cce60c270b1d2a369c2071c'

在 go 中:

    x, y := murmur3.sum128([]byte("chocolate-covered-espresso-beans"))
    fmt.printf("%x %xn", x, y)

结果:

70b1d2a369c2071c 8e7b3be22cce60c2

所以这两个词的顺序颠倒了。要在 python 中获得相同的结果,您可以尝试以下操作:

name = "chocolate-covered-espresso-beans"
hash = mmh3.hash128(name.encode('utf-8'), signed=False).to_bytes(16, byteorder='big', signed=False)
hash = hash[8:] + hash[:8]
print(base64.urlsafe_b64encode(hash).decode('utf-8').strip("="))
# cLHSo2nCBxyOezviLM5gwg
卓越飞翔博客
上一篇: 别名和嵌入的内存使用
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏