web-dev-qa-db-fra.com

chaîne de hachage unicode en python

J'essaie de hacher des chaînes Unicode:

hashlib.sha1(s).hexdigest()
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-81: 
ordinal not in range(128)

s est quelque chose comme:

œ∑¡ ™ £ ¢ ∞§¶ • ªº– ≠ œ∑´® † ¥ ¨ˆøπ “'åß∂ƒ © ¬… æΩ≈ç√∫˜µ≤≥ ÷ åйцукенгшщзхъфывапролджэячму “« ««\Dzћ ÷… • l «xcvіƒm≤≥ї!! @ # $ © ^ & * (() ––––––––– ∆∆∆∆∆∆∆∆∆∆∆∆∆ •… ћzdzћ… • l •… zћ ÷… • •… •… •… •… •… •… … •… •… • •… •… •… •… •… •… •…

que dois-je réparer?

44
Halst

Apparemment, hashlib.sha1 n'attend pas d'objet unicode, mais plutôt une séquence d'octets dans un objet str. Encoder votre chaîne unicode en une séquence d'octets (en utilisant, par exemple, l'encodage UTF-8) devrait résoudre ce problème:

>>> import hashlib
>>> s = u'é'
>>> hashlib.sha1(s.encode('utf-8'))
<sha1 HASH object @ 029576A0>

L'erreur est due au fait qu'il essaie de convertir l'objet unicode en un str automatiquement, en utilisant le codage ascii par défaut, qui ne peut pas gérer tous ces caractères non-ASCII (car votre chaîne n'est pas du pur ASCII).

Les Python docs et cet article de Joel Spolsky constituent un bon point de départ pour en savoir plus sur l’Unicode et les encodages.

84
Cameron

Utilisez le format de codage utf-8, essayez cette méthode simple,

>>> import hashlib
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest()
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f'
3
Jay Patel

Vous hachez des octets, pas des chaînes. Donc vous devez savoir quels octets vous voulez vraiment hacher, si une représentation mémoire utf8 de la chaîne, une représentation mémoire utf16 de la chaîne, etc.

0
Eduardo