首页 > 解决方案 > 如何在无需手动处理数据块的情况下对大文件进行哈希处理?

问题描述

当我们想在 Python 中获取一个大文件的哈希值时,使用 Python 的hashlib,我们可以像这样处理大小为 1024 字节的数据块:

import hashlib

m = hashlib.md5()
chunksize = 1024
with open("large.txt", 'rb') as f:
    while True:
        chunk = f.read(chunksize)
        if not chunk:
            break
        m.update(chunk)
print(m.hexdigest())

或者干脆忽略块的分割,像这样:

import hashlib
sha256 = hashlib.sha256()
with open(f, 'rb') as g:
    sha256.update(g.read())
print(sha256.hexdigest())

找到最佳实现可能很棘手,并且需要进行一些性能测试和改进(1024 个块?4KB?64KB?等),如Python 3 中的哈希文件中详述?获取一个非常大的文件的哈希字符串

问题:是否有跨平台、即用型的函数来使用 Python 计算大文件的 MD5 或 SHA256?(这样我们就不需要重新发明轮子,或者担心最佳块大小等)

就像是:

import hashlib

# get the result without having to think about chunks, etc.
hashlib.file_sha256('bigfile.txt')

标签: pythonhashmd5sha256

解决方案


为您的用例创建了一个包,该包simple-file-checksum仅使用子进程调用opensslmacOS/Linux 和CertUtilWindows,并仅从输出中提取摘要。


简单文件校验和

[资源]

返回文件的 MD5、SHA1、SHA256、SHA384 或 SHA512 校验和。

安装

运行以下命令进行安装:

pip3 install simple-file-checksum

用法

蟒蛇

>>> from simple_file_checksum import get_checksum
>>> get_checksum("tst/file.txt")
'9e107d9d372bb6826bd81d3542a419d6'
>>> get_checksum("tst/file.txt", algorithm="MD5")
'9e107d9d372bb6826bd81d3542a419d6'
>>> get_checksum("tst/file.txt", algorithm="SHA1")
'2fd4e1c67a2d28fced849ee1bb76e7391b93eb12'
>>> get_checksum("tst/file.txt", algorithm="SHA256")
'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592'
>>> get_checksum("tst/file.txt", algorithm="SHA384")
'ca737f1014a48f4c0b6dd43cb177b0afd9e5169367544c494011e3317dbf9a509cb1e5dc1e85a941bbee3d7f2afbc9b1'
>>> get_checksum("tst/file.txt", algorithm="SHA512")
'07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6'

终端:

$ simple-file-checksum tst/file.txt
9e107d9d372bb6826bd81d3542a419d6
$ simple-file-checksum tst/file.txt -a MD5
9e107d9d372bb6826bd81d3542a419d6
$ simple-file-checksum tst/file.txt -a SHA1
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
$ simple-file-checksum tst/file.txt -a SHA256
d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
$ simple-file-checksum tst/file.txt -a SHA384
ca737f1014a48f4c0b6dd43cb177b0afd9e5169367544c494011e3317dbf9a509cb1e5dc1e85a941bbee3d7f2afbc9b1
$ simple-file-checksum tst/file.txt -a SHA512
07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6

推荐阅读