python - 在 Python 中散列文件

标签 python hash md5 sha1 hashlib

我希望 python 读取到 EOF,以便我可以获得适当的哈希,无论是 sha1 还是 md5。请帮忙。这是我目前所拥有的:

import hashlib

inputFile = raw_input("Enter the name of the file:")
openedFile = open(inputFile)
readFile = openedFile.read()

md5Hash = hashlib.md5(readFile)
md5Hashed = md5Hash.hexdigest()

sha1Hash = hashlib.sha1(readFile)
sha1Hashed = sha1Hash.hexdigest()

print "File Name: %s" % inputFile
print "MD5: %r" % md5Hashed
print "SHA1: %r" % sha1Hashed

最佳答案

TL;DR 使用缓冲区来不使用大量内存。

我相信,当我们考虑处理非常大的文件对内存的影响时,我们就找到了问题的症结所在。我们不希望这个坏男孩通过 2 GB 的内存来处理 2 GB 的文件,所以,如 pasztorpisti指出,我们必须分 block 处理那些更大的文件!

import sys
import hashlib

# BUF_SIZE is totally arbitrary, change for your app!
BUF_SIZE = 65536  # lets read stuff in 64kb chunks!

md5 = hashlib.md5()
sha1 = hashlib.sha1()

with open(sys.argv[1], 'rb') as f:
    while True:
        data = f.read(BUF_SIZE)
        if not data:
            break
        md5.update(data)
        sha1.update(data)

print("MD5: {0}".format(md5.hexdigest()))
print("SHA1: {0}".format(sha1.hexdigest()))

我们所做的是,在我们使用 hashlib 的方便花花公子 update method 时,我们以 64kb block 更新了这个坏男孩的哈希值。 .这样一来,我们使用的内存要比一次对这个人进行哈希处理所需的 2gb 少得多!

您可以使用以下方法进行测试:

$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d  bigfile

希望有帮助!

所有这些都在右侧的链接问题中进行了概述:Get MD5 hash of big files in Python


附录!

一般来说,在编写 python 时,养成遵循 pep-8 的习惯会有所帮助。 .例如,在 python 中,变量通常用下划线分隔,而不是驼峰式。但这只是一种风格,没有人真正关心这些事情,除了那些不得不阅读糟糕风格的人......这可能是你多年后阅读这段代码。

关于python - 在 Python 中散列文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22058048/

相关文章:

Python 用循环多重处理一个大列表

python - 如何处理要在 cron 作业中处理的新文件

java - 使用 Java 读取 C 驱动器上每个文件的元数据和 MD5 哈希值

MySQL更新另一列的md5

python - md5模块错误

python - 如何解释 Seaborn distplot 的轴

python一次检查各种相等性的最低成本

python - Numpy:我应该使用 newaxis 还是 None?

在 C 中将十六进制值转换为字符数组

c# - 内存中的 System.Drawing.Image 需要 MD5 哈希