Проблема в том, что вы пытаетесь хэшировать строку, которая не конвертируется в 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 и Unicode. В частности, см. Раздел «Почему не печатается?»