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

Compatibilité de hachage Murmur3 entre Go et Python

王林
王林avant
2024-02-09 13:10:191163parcourir

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

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

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'

en route :

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

Résultat :

70b1d2a369c2071c 8e7b3be22cce60c2

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer