hashlib:Unicode 对象必须在散列之前编码

hashlib: Unicode-objects must be encoded before hashing

我是运行这个hashlib代码,几乎一路运行:

def generate_hashes(peaks, fan_value=DEFAULT_FAN_VALUE):
if PEAK_SORT:
  sorted(peaks,key=itemgetter(1))

# bruteforce all peaks
peaks=list(peaks)
len_peaks=len(peaks)
for i in range(len_peaks):
  for j in range(1, fan_value):
    if (i + j) < len(peaks):

      # take current & next peak frequency value
      freq1 = peaks[i][IDX_FREQ_I]
      freq2 = peaks[i + j][IDX_FREQ_I]

      # take current & next -peak time offset
      t1 = peaks[i][IDX_TIME_J]
      t2 = peaks[i + j][IDX_TIME_J]

      # get diff of time offsets
      t_delta = t2 - t1

      # check if delta is between min & max
      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)

但是,它returns这个错误:

 h = hashlib.sha1(("%s|%s|%s") % (str(freq1), str(freq2), str(t_delta)))
TypeError: Unicode-objects must be encoded before hashing

老实说,我完全迷路了,不知道如何解决。如果你们对代码的细节有任何后续问题,我会尽力回答。如有任何反馈,我们将不胜感激。

答案在错误消息中:在散列之前对您的文本字符串使用 encode

h = hashlib.sha1(("%s|%s|%s" % (str(freq1), str(freq2), str(t_delta))).encode('utf-8'))

这是必要的原因是 hashlib.sha1() 需要一个 bytes 对象,因为它的内部工作方式。普通 Python 字符串(自版本 3.0 起)由 Unicode 代码点组成,不适合一个字节。他们需要一个 encoding 来定义代码点和字节之间的转换是如何发生的。 UTF-8 是最流行的编码,因为它可以处理每个 Unicode 代码点,同时保持与 ASCII 等旧编码的向后兼容。