Python 3中如何对文件进行哈希处理?

6
在Python 2中,可以通过执行以下命令来对字符串进行哈希处理:
someText = "a"
hashlib.sha256(someText).hexdigest()

但在Python 3中,需要进行编码:

someText = "a".encode("ascii")
hashlib.sha256(someText).hexdigest()

但是,当我尝试使用文件时:
f = open(fin, "r")
sha = hashlib.sha256()
while True:
    data = f.read(2 ** 20).encode("ascii")
    if not data:
        break
    sha.update(data)
f.close()

我在很多文件中都看到了这个:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe1 in position 8: invalid continuation byte

我猜这是因为它是一个二进制文件,很可能无法转换为ASCII码。

如何在不出现此问题的情况下对文件进行编码?


4
尝试使用open(fin, "rb")以二进制模式打开该文件。 - BrenBarn
@BrenBarn的方法完美地解决了问题,你应该回答他。 - Lucas Phillips
你能不能不这样写:sha.update(open(filename, "rb").read)?为什么要写'2 ** 20'? - ikwyl6
3个回答

6
在Unix系统中,Python 2没有区分二进制文件和文本模式文件,因此打开方式无所谓。但是在Python 3中,在每个平台上都很重要。sha256()需要二进制输入,但您以文本模式打开了文件。这就是为什么@BrenBam建议您以二进制模式打开文件的原因。
由于您以文本模式打开文件,Python 3认为它需要解码文件中的位将字节转换为Unicode字符串。但你根本不想解码是吧?那么请以二进制模式打开文件,这样您将读取到字节字符串,而这正是sha256()想要的。
顺便说一下,您的:
someText = "a".encode("ascii")
hashlib.sha256(someText).hexdigest()

可以通过相关的方式更轻松地完成:

hashlib.sha256(b"a").hexdigest()

也就是说,直接传递二进制数据,而不必费心将Unicode字符串进行编码(如文字字面量"a")。

6

尝试以二进制模式打开文件,使用open(fin, "rb")


0

我编写了一个模块,可以使用不同的算法对大文件进行哈希处理。

pip3 install py_essentials

使用模块方法如下:

from py_essentials import hashing as hs
hash = hs.fileChecksum("path/to/the/file.txt", "sha256")

请查看文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接