TypeError: Unicode-объекты должны быть закодированы перед хэшированием в функции Hashlib

Я проверил все другие решения той же проблемы в stackoverflow, а также попробовал их, но ничего не сработало. Я просто публикую здесь ссылки вместо кода, так как код огромен и будет менее интерактивным.

Ссылка на репозиторий: https://github.com/executable16/audio-fingerprint-identifying-python

Однако конкретно ошибка находится в строке №. 2 здесь:

if t_delta >= MIN_HASH_TIME_DELTA and t_delta <= MAX_HASH_TIME_DELTA:
            h = hashlib.sha1("%s|%s|%s" % (str(freq1), str(freq2), str(t_delta)))
            yield (h.hexdigest()[0:FINGERPRINT_REDUCTION], t1)

Пробовал использовать .encode('utf-8') но увы не помогло. Вот что я пробовал:

if t_delta >= MIN_HASH_TIME_DELTA and t_delta <= MAX_HASH_TIME_DELTA:
            first = str(freq1).encode('utf-8')
            second = str(freq2).encode('utf-8')
            third = str(t_delta).encode('utf-8')
            h = hashlib.sha1("%s|%s|%s" % (first, second, third))
            yield (h.hexdigest()[0:FINGERPRINT_REDUCTION], t1)

Ошибка в форме текста:

sqlite - connection opened
 * id=2 channels=2: file_example_MP3_700KB.mp3
   new song, going to analyze..
   fingerprinting channel 1/2
   local_maxima: 664 of frequency & time pairs
Traceback (most recent call last):
  File "collect-fingerprints-of-songs.py", line 54, in <module>
    channel_hashes = set(channel_hashes)
  File "/home/executable/Desktop/audio-fingerprint-identifying-python/libs/fingerprint.py", line 168, in generate_hashes
    h = hashlib.sha1("%s|%s|%s" % (str(freq1), str(freq2), str(t_delta)))
TypeError: Unicode-objects must be encoded before hashing
sqlite - connection has been closed
make: *** [Makefile:19: fingerprint-songs] Error 1

Было бы действительно здорово, если бы я мог найти какое-то рабочее решение вместе с правильными объяснениями.


person ATUL MALAKAR    schedule 18.04.2020    source источник


Ответы (2)


Возможно, попробуйте кодирование в команде hashlib:

h = hashlib.sha1("%b|%b|%b".encode('utf-8') % (str(freq1), str(freq2), str(t_delta)))
person l'L'l    schedule 18.04.2020
comment
Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат. - person Samuel Liew♦; 19.04.2020

Это сработало

h = hashlib.sha1(b"%s|%s|%s" % (str(freq1).encode('utf-8'), str(freq2).encode('utf-8'), str(t_delta ).кодировать('utf-8')))

person ATUL MALAKAR    schedule 18.04.2020