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 哈希兼容性的详细内容。更多信息请关注PHP中文网其他相关文章!