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中文網其他相關文章!