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 %x\n", 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
以上就是Go 和 Python 之间的 Murmur3 哈希兼容性的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341