我想让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
8条答案
按热度按时间htrmnn0y1#
TL;DR使用缓冲区以避免占用大量内存。
我相信,当我们考虑到处理非常大的文件所涉及的内存问题时,我们就找到了问题的症结所在,我们不希望这个坏家伙为了一个2GB的文件而耗费2GB的内存,所以,正如pasztorpisti所指出的,我们必须分块处理那些更大的文件!
我们所做的就是在使用hashlib的dandy update方法时,用64 kb的块来更新这个坏家伙的哈希值,这样我们使用的内存比一次性哈希这个坏家伙所需的2gb要少得多!
您可以通过以下方式进行测试:
所有这些都在右侧的相关问题中列出:Get MD5 hash of big files in Python
附录!
一般来说,在写python的时候,养成遵循[pep-8][4]的习惯是有帮助的。例如,在python中,变量通常是用下划线分隔的,而不是用camelCased分隔的。但这只是风格,没有人真正关心这些东西,除了那些不得不阅读糟糕风格的人......可能是你在几年后阅读这段代码。
eeq64g8w2#
为了正确有效地计算文件的哈希值(Python 3中):
'b'
添加到filemode),以避免字符编码和行尾转换问题。readinto()
可避免缓冲区扰动。示例:
注意while循环使用了assignment expression,这在Python 3.8之前的版本中是不可用的。
对于较早的Python 3版本,您可以使用一个等效的变体:
5ktev3wc3#
我的提议很简单:
这里的所有其他答案似乎都太复杂了。(以理想的方式,或者如果你有更多关于底层存储的信息,你可以配置缓冲),所以最好是以块的形式读取哈希函数找到的理想值,这使得计算哈希函数更快或者至少CPU占用更少。使用Python缓冲并控制应该控制的内容:数据消费者认为理想的哈希块大小。
0ve6wy6x4#
下面是一个Python 3的POSIX解决方案(不是Windows!),它使用
mmap
将对象Map到内存。pb3skfrl5#
我已经编写了一个模块,它能够散列大文件与不同的算法。
按如下方式使用模块:
7kjnsjlb6#
你不需要用5-20行代码来定义一个函数!使用 pathlib 和 hashlib 库可以保存你的时间,py_essentials 也是另一种解决方案,但是第三方是*****。
我在这里使用了一些变量来显示步骤,您知道如何避免它。
你觉得下面的功能怎么样?
ego6inou7#
FWIW,我更喜欢这个版本,它有相同的内存和性能特征作为maxschlepzig的答案,但更可读IMO:
7gcisfzg8#