Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取md5校验和的完成百分比_Python_Cryptography_Md5 - Fatal编程技术网

Python 获取md5校验和的完成百分比

Python 获取md5校验和的完成百分比,python,cryptography,md5,Python,Cryptography,Md5,我目前得到的md5校验和如下所示: >>> import hashlib >>> f = open(file) >>> m = hashlib.md5() >>> m.update(f.read()) >>> checksum = m.hedxigest() 我需要返回一个大视频文件的校验和,这将需要几分钟才能生成。如何实现百分比计数器,使其在运行时打印每个百分比的完成百分比。比如: >>&g

我目前得到的md5校验和如下所示:

>>> import hashlib
>>> f = open(file)
>>> m = hashlib.md5()
>>> m.update(f.read())
>>> checksum = m.hedxigest()
我需要返回一个大视频文件的校验和,这将需要几分钟才能生成。如何实现百分比计数器,使其在运行时打印每个百分比的完成百分比。比如:

>>> checksum = m.hedxigest()
1% done...
2% done...
etc.

您可以重复调用
update()
方法,并将文件分块提供给它。因此,您可以自己展示进度

import hashlib
import os

def digest_with_progress(filename, chunk_size):
    read_size = 0
    last_percent_done = 0
    digest = hashlib.md5()
    total_size = os.path.getsize(filename)

    data = True
    f = open(filename)
    while data:
        # Read and update digest.
        data = f.read(chunk_size)
        read_size += len(data)
        digest.update(data)

        # Calculate progress.
        percent_done = 100 * read_size / total_size
        if percent_done > last_percent_done:
            print '%d%% done' % percent_done
            last_percent_done = percent_done
    f.close()
    return digest.hexdigest()
当我尝试用进度('/bin/bash',1024)打印摘要时,我得到的是:

1% done
2% done
3% done
4% done
5% done
6% done
7% done
8% done
9% done
10% done
11% done
12% done
13% done
14% done
15% done
16% done
17% done
18% done
19% done
20% done
21% done
22% done
23% done
24% done
25% done
26% done
27% done
28% done
29% done
30% done
31% done
32% done
33% done
34% done
35% done
36% done
37% done
38% done
39% done
40% done
41% done
42% done
43% done
44% done
45% done
46% done
47% done
48% done
49% done
50% done
51% done
52% done
53% done
54% done
55% done
56% done
57% done
58% done
59% done
60% done
61% done
62% done
63% done
64% done
65% done
66% done
67% done
68% done
69% done
70% done
71% done
72% done
73% done
74% done
75% done
76% done
77% done
78% done
79% done
80% done
81% done
82% done
83% done
84% done
85% done
86% done
87% done
88% done
89% done
90% done
91% done
92% done
93% done
94% done
95% done
96% done
97% done
98% done
99% done
100% done
b114ecaab65bc5b02f5a129bd29d1864
以下是此文件的实际详细信息

$ ls -l /bin/bash; md5sum /bin/bash
-rwxr-xr-x 1 root root 971384 Nov 30 16:31 /bin/bash
b114ecaab65bc5b02f5a129bd29d1864  /bin/bash
请注意,如果将
chunk\u size
设置得太大,则无法获得预期的输出。例如,如果我们在
/bin/bash
中读取100KB的块而不是1KB的块,这就是您看到的

10% done
21% done
31% done
42% done
52% done
63% done
73% done
84% done
94% done
100% done
b114ecaab65bc5b02f5a129bd29d1864

这种方法的局限性在于,我们只有在读入摘要后才能计算进度。因此,如果块大小太大,则每次读取块并更新摘要时,进程中的百分比差异将超过1%。块大小越大,完成工作的速度就越快。因此,为了提高效率,您可能希望放宽每个百分比的打印完成百分比的条件。

您应该使用
f.read(N_字节)
以块的形式读取文件,跟踪文件中的距离,并将块传递给
m.update
。这是一个昂贵的操作,而不是
md5.hexdigest

好吧,不是调用
hedxigest()
需要一段时间,而是读取文件需要一段时间


记住这一点,将
m.update(f.read())
替换为一个循环,在这个循环中,您可以逐块读取文件,更新校验和,并定期打印进度报告。

hashlib
有一个
摘要大小()
函数,可以返回结果哈希的大小(以字节为单位)。您可以将此大小与md5哈希完成后完成百分比的大小进行比较。@HunterMcMillen不可以。MD5摘要是固定长度的,它们不会像输入文本那样变长。FWIW,我一次读取50多个字节。16-64千左右。