Подтвердить что ты не робот

Строка хеширования unicode в python

Я пытаюсь использовать некоторые строки unicode:

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

где s что-то вроде:

œΣ¡ ™ £ ¢ ∞§¶ • ªº- ≠ œΣ'® † ¥ ¨øπ "'åß∂ƒ © ˙Δ˚¬... æΩ≈ç√∫~μ≤≥ ÷ åйцукенгшщзхъфывапролджэячсмитьбююю..юбьтијџўќ † њѓѕ '' "" " "\dzћ ÷... • Δљl" єђxcvіƒm≤≥ї @# $© ^ &! * (() ---------- ΔΔΔΔΔΔΔΔΔ ΔΔΔΔΔΔΔΔΔΔ •... ÷ ÷ ћzdzћ... • ΔљlљΔ •... ÷ ÷ ћzћ... • ΔљΔ •... • љΔ... љΔ •... Δљ •... Δљ •... љΔ •... •... Д Δ •... Δ • Δ... • ÷ Δ •... ÷ Δ •... ÷ Δ •... ÷ Δ •... ÷ Δ •... ÷ Δ •... ÷ Δ •...

что я должен исправить?

4b9b3361

Ответ 1

По-видимому hashlib.sha1 не ожидает объект unicode, а скорее последовательность байтов в объекте str. Кодирование строки unicode в последовательность байтов (с использованием, например, кодировки UTF-8) должно исправить ее:

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

Ошибка заключается в том, что она пытается автоматически преобразовать объект unicode в str, используя по умолчанию ascii кодировку, которая не может обрабатывать все те символы, отличные от ASCII (поскольку ваша строка не является чистый ASCII).

Хорошей отправной точкой для получения дополнительной информации о Unicode и кодировках является Python docs, и этот статьи Джоэла Спольского.

Ответ 2

Используйте формат кодирования utf-8, попробуйте этот простой способ,

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