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

问题描述

我正在运行这个 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)

但是,它返回此错误

 h = hashlib.sha1(("%s|%s|%s") % (str(freq1),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 代码点组成,它们不适合一个字节。他们需要一个编码来定义代码点和字节之间的转换是如何发生的。 UTF-8 是最流行的编码,因为它可以处理每一个 Unicode 代码点,同时保持向后兼容旧的编码,如 ASCII。