首頁 > 後端開發 > Golang > Murmur3 在 Go 和 Python 之間的哈希相容性

Murmur3 在 Go 和 Python 之間的哈希相容性

王林
發布: 2024-02-09 13:10:19
轉載
1207 人瀏覽過

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
登入後複製

以上是Murmur3 在 Go 和 Python 之間的哈希相容性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板