Murmur3-Hash-Kompatibilität zwischen Go und Python

王林
Freigeben: 2024-02-09 13:10:19
nach vorne
1160 Leute haben es durchsucht

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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'
Nach dem Login kopieren

in los:

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

Ergebnis:

70b1d2a369c2071c 8e7b3be22cce60c2
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!