问题描述
我正在运行这个 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。