Heim  >  Artikel  >  Backend-Entwicklung  >  Murmur3-Hash-Kompatibilität zwischen Go und Python

Murmur3-Hash-Kompatibilität zwischen Go und Python

王林
王林nach vorne
2024-02-09 13:10:191163Durchsuche

Go 和 Python 之间的 Murmur3 哈希兼容性

php-Editor Zimo stellt Ihnen die Murmur3-Hash-Kompatibilität zwischen Go und Python vor. Murmur3 ist ein effizienter Hash-Algorithmus, der häufig für Hash-Operationen in Datenstrukturen und Algorithmen verwendet wird. Der Murmur3-Hashing-Algorithmus ist in den beiden Programmiersprachen Go und Python unterschiedlich implementiert, sodass es bei der Verwendung zu Kompatibilitätsproblemen kommen kann. In diesem Artikel werden die Unterschiede im Murmur3-Hashing-Algorithmus in Go und Python detailliert beschrieben und Lösungen bereitgestellt, um die korrekte Hash-Kompatibilität bei der Weitergabe von Daten zwischen verschiedenen Sprachen sicherzustellen.

Frageninhalt

Wir haben zwei verschiedene Bibliotheken, eine in Python und eine in Go, die Murmur3-Hashes auf die gleiche Weise berechnen müssen. Leider gelang es uns trotz aller Bemühungen nicht, mit der Bibliothek die gleichen Ergebnisse zu erzielen. Ausgehend von dieser Frage zu Java und Python ist die Kompatibilität nicht unbedingt einfach.

Jetzt verwenden wir Python mmh3 und gehen zur Bibliothek github.com/spaolacci/murmur3.

in los:

hash := murmur3.new128()
hash.write([]byte("chocolate-covered-espresso-beans"))
fmt.println(base64.rawurlencoding.encodetostring(hash.sum(nil)))
// output: clhso2ncbxyoezvilm5gwg

In 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

In go erhält murmur3返回一个uint64,所以我们假设python中的signed=false;但是我们也尝试了 signed=true nicht den passenden Hashwert.

Wir sind offen für verschiedene Bibliotheken, würden aber gerne wissen, ob es ein Problem mit unserem Go- oder Python-Ansatz zur Berechnung eines Base64-codierten Hashs aus einem String gibt. Jede Hilfe wird geschätzt.

Workaround

Das erste Python-Ergebnis ist fast korrekt.

>>> binascii.hexlify(base64.b64decode('jns74izoymjwsdkjacihha=='))
b'8e7b3be22cce60c270b1d2a369c2071c'

in los:

    x, y := murmur3.sum128([]byte("chocolate-covered-espresso-beans"))
    fmt.printf("%x %x\n", x, y)

Ergebnis:

70b1d2a369c2071c 8e7b3be22cce60c2

Die Reihenfolge dieser beiden Wörter ist also umgekehrt. Um das gleiche Ergebnis in Python zu erzielen, können Sie Folgendes versuchen:

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

Das obige ist der detaillierte Inhalt vonMurmur3-Hash-Kompatibilität zwischen Go und Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen