Maison > développement back-end > Golang > Compatibilité de hachage Murmur3 entre Go et Python

Compatibilité de hachage Murmur3 entre Go et Python

王林
Libérer: 2024-02-09 13:10:19
avant
1228 Les gens l'ont consulté

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

l'éditeur php Zimo vous présente la compatibilité de hachage Murmur3 entre Go et Python. Murmur3 est un algorithme de hachage efficace couramment utilisé pour les opérations de hachage dans les structures de données et les algorithmes. L'algorithme de hachage Murmur3 est implémenté différemment dans les deux langages de programmation Go et Python, des problèmes de compatibilité peuvent donc survenir lors de son utilisation. Cet article détaillera les différences entre l'algorithme de hachage Murmur3 dans Go et Python et fournira des solutions pour garantir une compatibilité de hachage correcte lors de la transmission de données entre différentes langues.

Contenu de la question

Nous avons deux bibliothèques différentes, une en python et une en go, qui doivent calculer les hachages murmur3 de la même manière. Malheureusement, malgré tous nos efforts, nous n’avons pas réussi à amener la bibliothèque à produire les mêmes résultats. À en juger par cette question sur Java et Python, la compatibilité n'est pas nécessairement simple.

Maintenant, nous utilisons python mmh3 et allons dans la bibliothèque github.com/spaolacci/murmur3.

en route :

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

En 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
Copier après la connexion

En go, murmur3返回一个uint64,所以我们假设python中的signed=false;但是我们也尝试了 signed=true n'obtient pas la valeur de hachage correspondante.

Nous sommes ouverts à différentes bibliothèques, mais aimerions savoir s'il y a un problème avec notre approche go ou python pour calculer un hachage codé en base64 à partir d'une chaîne. Toute aide est appréciée.

Solution

Le premier résultat python est presque correct.

>>> binascii.hexlify(base64.b64decode('jns74izoymjwsdkjacihha=='))
b'8e7b3be22cce60c270b1d2a369c2071c'
Copier après la connexion

en route :

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

Résultat :

70b1d2a369c2071c 8e7b3be22cce60c2
Copier après la connexion

L'ordre de ces deux mots est donc inversé. Pour obtenir le même résultat en python vous pouvez essayer ceci :

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
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal