- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
引用Get MD5 hash of big files in Python和 Hashlib in Windows and Linux
在回答这两个问题时,建议在函数 md5.update() 中使用更大的数据 block 以提高性能。
我所做的所有测试似乎都表明使用较小的 block 可提供最佳性能。
考虑以下代码:
def test(factor):
filehash = hashlib.md5()
blk_size_to_read = filehash.block_size * (2**factor)
with open(largetestfile, 'rb') as f:
read_data = f.read(blk_size_to_read)
filehash.update(read_data)
filehash.digest()
if __name__ == '__main__':
for ctr in xrange(0, 12):
funcstr = "test({})".format(str(ctr))
timetaken = timeit.timeit(funcstr, setup="from __main__ import test", number = 5000)
print "Factor: {} Time: {}".format(str(ctr), str(timetaken))
我所做的所有测试表明,使用 factor
0 或 1(即 64 或 128 字节)时可获得最佳性能。
为什么我看到的结果与所引用问题中的结果不同?
我尝试过大小从 700MB 到 1.2GB 的二进制和纯文本文件,我在 Ubuntu 12.04 上使用 Python 2.7.3
第二个问题:我是否按照应有的方式使用 timeit?
最佳答案
发现错误!我当时只读
一个 block ,然后什么都不做!
改变
with open(largetestfile, 'rb') as f:
read_data = f.read(blk_size_to_read)
filehash.update(read_data)
到
with open(testfile, 'rb') as f:
while (True):
read_data = f.read(blk_size_to_read)
if not read_data:
break
filehash.update(read_data)
解决问题。
更新:
我运行了上面程序的一个稍微修改过的版本,以建立在增量使用 update() 查找给定文件的哈希值时要使用的最佳缓冲区大小。我还想确定增量哈希是否有任何好处,而不是一次性计算文件的哈希(内存限制除外)。
我为此创建了 20 个文件(带有随机数据),文件大小从 4096 字节到 2.1 GB。这些文件中的每一个的 md5 哈希是使用从 2**6
字节(64 字节 - block 大小)到 2**20
字节的缓冲区大小计算的。使用 timeit,每一个都运行 100 次,并记录最短执行时间获得的执行时间。还记录了一次对整个文件进行哈希计算的执行时间。
结果如下……
FileName Filesize Chunksize Chunked Time Complete Time %diff
file5.txt 4096 4096 0.0014789 0.0014701 -0.60%
file6.txt 8192 524288 0.0021310 0.0021060 -1.19%
file7.txt 16384 16384 0.0033200 0.0033162 -0.12%
file8.txt 32768 65536 0.0061381 0.0057440 -6.86%
file9.txt 65536 65536 0.0106990 0.0112500 4.90%
file10.txt 131072 131072 0.0203800 0.0206621 1.37%
file11.txt 262144 524288 0.0396681 0.0401120 1.11%
file12.txt 524288 1048576 0.0780780 0.0787551 0.86%
file13.txt 1048576 1048576 0.1552539 0.1564729 0.78%
file14.txt 2097152 262144 0.3101590 0.3167789 2.09%
file15.txt 4194304 65536 0.6295781 0.6477270 2.80%
file16.txt 8388608 524288 1.2633710 1.3030031 3.04%
file17.txt 16777216 524288 2.5265670 2.5925691 2.55%
file18.txt 33554432 65536 5.0558681 5.8452392 13.50%
file19.txt 67108864 65536 10.1133211 11.6993010 13.56%
file20.txt 134217728 524288 20.2226040 23.3923230 13.55%
file21.txt 268435456 65536 40.4060180 46.6972852 13.47%
file22.txt 536870912 65536 80.9403431 93.4165111 13.36%
file23.txt 1073741824 524288 161.8108051 187.1303582 13.53%
file24.txt 2147483648 65536 323.4812710 374.3899529 13.60%
Chunked Time
是文件被分解成 chuck 并递增 hased 时的执行时间; Complete Time
是一次性对整个文件进行哈希处理的执行时间。 %diff
是 Chunked Time 和“Complete Time”之间的百分比差异。
观察:
2**25
) 字节及以上),使用增量方法而不是将整个文件散列在一个文件中似乎有相当大的性能优势(更少的时间)去吧。2**16
) 字节注释:python 2.7.3; Ubuntu 12.06 64 位; 8 GB RAM用于此的代码可在此处获得... http://pastebin.com/VxH7bL2X
关于python - Hashlib:在 md5.update() 中使用的 block 的最佳大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17731660/
Bellow 是一个代码,它将 hashlib.sha256() 与我的 sha256_test() 函数进行比较,该函数是在哈希率性能方面用原始 Python 编写的。 from time impo
我在google上搜索,发现它是预先安装的,不需要使用pip安装 但是当我通过观看 youtube 运行程序编写但运行时它给了我错误 > Enter md5 hash: b73bf7d3ba1a517
我想做一个列表理解,对两个列表中的元素进行哈希处理。我以为它会是这样的: hashes = [hashlib.md5().update(a + b).digest() for a, b in zip(
当我尝试将 ripemd160 与 hashlib 一起使用时,它说找不到它。 我使用easy_install hashlib安装了hashlib,但仍然找不到ripemd160。 我使用的是 Ubu
我在计算/bin/* 目录下所有文件的所有校验和时遇到问题。我正在用 Python 实现 HIDS,所以我需要计算每个文件的校验和并将其保存在列表中……所以我这里的代码只返回/bin/* 目录的第一个
我想知道在 python 2.7 中观察到的行为的实际原因是什么: import hashlib hashlib.md5('foo') == hashlib.md5('foo') 返回错误。但是……
我正在使用 hashlib 模块来检验关于哈希算法的假设,但我得到了奇怪的结果。我用 Windows fciv 程序检查我的结果。我使用的工作流程是这样的: 从用户那里收集文件和算法。 使用该算法打印
我试图用 sha1 加密一个字符串,但我从服务器收到一个错误: "No Module Named hashlib" 通过使用以下代码: import hashlib encrypted = hashl
这是我的代码: import hashlib real = hashlib.sha512("mom") status = True while status: inp = raw_input(
我正在尝试创建一个具有用户交互的哈希函数。这个想法是,用户选择他/她想要的哈希值(即 md5、sha1 等),然后程序完成其余的工作。 我的代码: hashstring = "hashlib" + f
如果我这样做,我会得到这个: >>> import hashlib >>> hashlib.sha224('Nguyễn').hexdigest() Unsupported characters in
我知道之前有人问过这个问题,我也看到了一些答案,但这个问题更多的是关于我的代码和完成这个任务的最佳方式。 我想扫描一个目录并查看该目录中是否有任何重复项(通过检查 MD5 哈希值)。以下是我的代码:
我正在尝试使用 hashlib 模块中的函数 hashlib.md5() 计算文件的 md5 哈希值。 所以我写了这段代码: Buffer = 128 f = open("c:\\file.tct",
我想创建一个 hashlib 实例,update() 它,然后以某种方式保留它的状态。稍后,我想使用此状态数据重新创建对象,并继续 update() 它。最后,我想获取总累积运行数据的 hexdige
我在 Dreamhost 服务器上运行 Python 脚本。我们的 Python 脚本使用 Python 2.7 - 我们进行了自定义安装,因为 Dreamhost 使用 Python 2.6。在 1
我刚刚从源代码安装了 Python 2.6.6,我得到了什么: >>> import hashlib Traceback (most recent call last): File "", lin
我正在努力完全理解加密的工作原理和编码方式,尤其是使用 Python 时。我只是想了解基础知识并以最简单的形式创建代码。 我将在两个不同的站点之间传递用户 ID,但显然我需要使用私钥对其进行加密,以便
The Python 2.7 documentation关于 hashlib 哈希器有这样的说法: hash.update(arg) Update the hash object with t
我正在尝试编写一个脚本,为指定根目录中的所有文件名和目录名生成哈希值。到目前为止,这是我的脚本: import hashlib import os import sys class Hasher:
我正在开发一个小的 python 程序,该程序本质上将使用 word 文件强制执行 md5 哈希。该程序获取您的哈希值,然后您可以选择一个文件用作单词列表。然后它将在文件中逐行检查并生成一个 md5
我是一名优秀的程序员,十分优秀!