【问题标题】:Hashing file in Python 3?Python 3中的散列文件?
【发布时间】:2013-10-13 05:01:34
【问题描述】:

在 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。

如何在没有这个问题的情况下对文件进行编码?

【问题讨论】:

  • 尝试使用open(fin, "rb")以二进制模式打开文件。
  • @BrenBarn 工作得很好,你应该这样回答。

标签: python hash


【解决方案1】:

在 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" 就是这样)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      pip3 install py_essentials
      

      像这样使用模块:

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

      看看documentation

      【讨论】:

        猜你喜欢
        • 2014-03-30
        • 2018-06-16
        • 2020-07-06
        • 2019-09-01
        • 1970-01-01
        • 2020-07-31
        • 2012-06-12
        • 1970-01-01
        • 2015-09-27
        相关资源
        最近更新 更多