我想读入一个密码文件。然后我试图计算每个密码的散列,并将其与一个散列进行比较,以确定我是否发现了密码。但是,我一直收到的错误消息是“TypeError:Unicode对象必须在散列之前编码”。这是我的代码:
from hashlib import sha256
with open('words','r') as f:
for line in f:
hashedWord = sha256(line.rstrip()).hexdigest()
if hashedWord == 'ca52258a43795ab5c89513f9984b8f3d3d0aa61fb7792ecefe8d90010ee39f2':
print(line + "is one of the words!")
有人能帮忙解释一下吗?
错误消息的意思正是它所说的:您有一个Unicode字符串。不能SHA-256-hash Unicode字符串,只能哈希字节。
但是为什么要有Unicode字符串呢?因为您以文本模式打开一个文件,这意味着您隐式地要求Python将该文件中的字节(使用默认编码)解码为Unicode。如果要获取原始字节,必须使用二进制模式。
换言之,只要改变这一行:
…至:
您可能会注意到,一旦修复此问题,
print
行就会引发异常。为什么?因为你正试图将bytes
添加到str
。您还缺少一个空格,并且正在打印未剥离的行。您可以通过使用两个参数print
(如print(line.rstrip(), "is one of the words")
)修复所有这些问题。但是,当您希望输出
Århus is one of the words
时,您将得到类似b'\xc3\x85rhus' is one of the words
的输出。那是因为你现在有字节,而不是字符串。由于Python不再为您解码,因此您需要手动执行此操作。若要使用某些情况下不将编码指定为open
时可以使用的相同默认编码,只需在不带参数的情况下调用decode
。所以:相关问题 更多 >
编程相关推荐