我正在尝试使用python3中的hashlib将sha1字符串编码为十六进制。我收到属性错误。
程序在python2中成功运行。
gesture = file.read(hashlib.sha1().digest_size).encode('hex')
AttributeError: 'bytes' object has no attribute 'encode'
文件:???ӷJ?*L??R?????T%
(这是未加盐的SHA1哈希值)
以二进制模式读取的文件:b'\xae\x93\xf0\xd3\xb7\x7fJ\xb4*L\x90\xdeR\x91\xa8\xa1\x9b\xb6T\x0f'
我正在rb
模式下打开它
答案 0 :(得分:1)
散列本身将具有一个hexdigest
方法,该方法可以产生所需的结果。但是您发布的代码似乎试图将方法应用于file.read()
的返回值,而不是摘要对象。我猜你可能是说类似
sha = hashlib.sha1()
buffer = file.read(sha.digest_size)
sha.update(buffer)
gesture = sha.hexdigest()
尝试使用摘要大小指定要读取的字节数也是可疑的。通常,无论文件大小,都应读取整个文件。 digest.size
是SHA1算法的输出的长度,而不是其输入。
更常规的方式是
with open(filename, 'rb') as f:
sha = hashlib(f.read())
gesture = sha.hexdigest()
如果您的目标是将SHA1哈希的二进制表示形式读回到内存中,则hashlib
不直接支持它。哈希算法通常被设计为使其不可能或至少非常耗费资源,仅从摘要中重建原始对象。但是,当然,如果您使用hashlib
或类似名称保存pickle
对象,则应该能够读回该对象并基本上从上次中断的地方继续(尽管我认为运输酱菜可能会出现问题在某些Python版本之间。
如果您只想要字节序列的十六进制表示,则为What's the correct way to convert bytes to a hex string in Python 3?
with open(filename, 'rb') as f:
buffer = f.read()
hexbytes = buffer.hex()
答案 1 :(得分:1)
您可以这样做:
with open("your_file", "rb") as f:
Hash = f.read(hashlib.sha1().digest_size).hex()
这里hex
是类bytes
的方法。