Проблема в том, что вы пытаетесь хешировать строку, которая не конвертируется в ASCII. Метод str принимает объект unicode и по умолчанию преобразует его в ASCII.
Чтобы устранить эту проблему, вам нужно либо хэшировать объект unicode напрямую, либо преобразовать строку с помощью правильного кодека.
Например, вы могли бы это сделать, если вы читаете Юникода из консоли на США Windows, локализованной системы:
return hash(mystring.encode("cp437"))
С другой стороны, данные из реестра или API функции могут быть закодированы как:
return hash(mystring.encode("cp1252"))
Пожалуйста, обратите внимание, что кодирование для локальной системы варьируется в зависимости от локализации, так что вам нужно будет узнать, что это использует библиотеку локали.
Я заметил, что вы преобразовали str (self), что означает, что вам нужно переопределить метод __str__
, чтобы сделать там кодировку, и, вероятно, в __repr__
для затронутых объектов.
http://boodebr.org/main/python/all-about-python-and-unicode
хорошая ссылка, которая имеет много полезной информации о Python и Юникода. См., В частности, раздел «Почему печать не работает?»