Python: hashlib e Unicode?

Você sabe, o Unicode é uma parte do nosso kit de ferramentas do codificador (ou pelo menos deveríamos saber, como disse Joel [1]). O Unicode é muito útil quando estamos lidando com aplicativos multilíngues, mas pode causar alguns problemas …

Se você precisar fazer o hash de um objeto Unicode em Python, poderá obter um UnicodeEncodeError.

>>>from hashlib import md5 #this is just an example
>>>uFoo=u"why dòn't ìnsért sòme strànge chàrs? ù.ù"
>>>md5(uFoo).hexdigest()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'xf2' in position 5:ordinal not in range(128)

Pesquisando na internet, encontrei um problema interessante no Python Bugs Tracker [2], onde você pode ler uma boa explicação do erro.

A solução é muito rápida: apenas codifique seu objeto Unicode em seu conjunto de caracteres favorito.

>>>from hashlib import md5 #this is just an example
>>>uFoo=u"why dòn't ìnsért sòme strànge chàrs? ù.ù"
>>>md5( uFoo.encode("utf-8") ).hexdigest()
'80a0d8c0e0a53e2e3a9edafa4f0b2c03'

Mais de um objeto Unicode? Sem problemas!

>>> uBaz, uBar=u"lòl", u"53è" #another example
>>> md5( (uBaz+uBar).encode("utf-8") ).hexdigest()
'81df2a1da0045cf65ce378a61604828f'

Links:
[1] http://www.joelonsoftware.com/articles/Unicode.html
[2] http://bugs.python.org/issue2948