python - 如何在无需手动处理数据块的情况下对大文件进行哈希处理?
问题描述
当我们想在 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')
解决方案
为您的用例创建了一个包,该包simple-file-checksum
仅使用子进程调用openssl
macOS/Linux 和CertUtil
Windows,并仅从输出中提取摘要。
简单文件校验和
返回文件的 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
推荐阅读
- c# - 将 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 升级到版本 2.0.1 会导致 WhiteSource Bolt 报告 CVE-2017-0248
- c# - 如何从 C# 中的 JObject 获取特定值
- javascript - 如何使用 Ajax 将图像添加到 Unite Gallery?
- sql - SQL拆分字符串并获取NULL值而不是空字符串
- tsql - 尝试将临时表中的列值设置为空字符串时出现问题
- javascript - JS递归检查对象字段(+嵌套)为假/真
- python - 通过鼠标单击从板上选择方块的有效方法(Python 3.X. tkinter)
- java - PowerMockito.mockStatic() 但在调用静态方法时仍然得到 NPE
- debugging - 如何防止条件语句中不需要的变量赋值?
- mongodb - Docker容器未连接mongodb主机