我们有两个不同的库,一个在Python中,另一个在Go中,它们需要以相同的方式计算Murmu3散列.不幸的是,无论我们多么努力,我们都不能让库产生相同的结果.从this SO question about Java and Python%来看,兼容性并不一定是直接的.
现在我们使用的是python mmh3和Go github.com/spaolacci/murmur3库.
在围棋中:
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
;然而,我们也try 了signed=True
,但没有得到匹配的散列.
我们对不同的库持开放态度,但我们想知道从字符串计算Base64编码的哈希的Go或Python方法是否有问题.如果有任何帮助,我很感激.