gpt4 book ai didi

python - 为什么 python hashlib.md5 比 linux coreutils md5sum 快

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:50 24 4
gpt4 key购买 nike

我刚刚发现 python hashlib.md5 可能比 coreutils md5sum 更快。

python 哈希库

def get_hash(fpath, algorithm='md5', block=32768):
if not hasattr(hashlib, algorithm):
return ''
m = getattr(hashlib, algorithm)()
if not os.path.isfile(fpath):
return ''
with open(fpath, 'r') as f:
while True:
data = f.read(block)
if not data:
break
m.update(data)
return m.hexdigest()

核心工具 md5sum

def shell_hash(fpath, method='md5sum'):
if not os.path.isfile(fpath):
return ''
cmd = [method, fpath] #delete shlex
p = Popen(cmd, stdout=PIPE)
output, _ = p.communicate()
if p.returncode:
return ''
output = output.split()
return output[0]

关于我计算md5和sha1的测试结果时间有4列。

第 1 列是 coreutils md5sum 或 sha1sum 的调用时间。

第2列是python hashlib md5或sha1的cal time,读取1048576 chunk。

第3列是python hashlib md5或sha1的cal time,通过读取32768 chunk。

第四列是python hashlib md5或sha1的cal time,通过读取512 chunk。

4.08805298805 3.81827783585 3.72585606575 5.72505903244
6.28456497192 3.69725108147 3.59885907173 5.69266486168
4.08003306389 3.82310700417 3.74562311172 5.74706888199
6.25473690033 3.70099711418 3.60972714424 5.70108985901
4.07995700836 3.83335709572 3.74854302406 5.74988412857
6.26068210602 3.72050404549 3.60864400864 5.69080018997
4.08979201317 3.83872914314 3.75350999832 5.79242300987
6.28977203369 3.69586396217 3.60469412804 5.68853116035
4.0824379921 3.83340883255 3.74298214912 5.73846316338
6.27566385269 3.6986720562 3.6079480648 5.68188500404
4.10092496872 3.82357311249 3.73044300079 5.7778570652
6.25675201416 3.78636980057 3.62911510468 5.71392583847
4.09579920769 3.83730792999 3.73345088959 5.73320293427
6.26580905914 3.69428491592 3.61320495605 5.69155502319
4.09030103683 3.82516098022 3.73244214058 5.72749185562
6.26151800156 3.6951239109 3.60320997238 5.70400810242
4.07977604866 3.81951498985 3.73287010193 5.73037815094
6.26691818237 3.72077894211 3.60203289986 5.71795105934
4.08536100388 3.83897590637 3.73681998253 5.73614501953
6.2943251133 3.72131896019 3.61498594284 5.69963502884
(My computer has 4-core i3-2120 CPU @ 3.30GHz, 4G memory.
The file calculated by these program is about 2G in size.
The odd rows are about md5 and the even rows are about sha1.
The time in this table are in second.)

经过 100 多次测试,我发现 python hashlib 总是比 md5sum 或 sha1sum 快。

我还阅读了一些关于 Python2.7/Modules/{md5.c,md5.h,md5module.c} 和 gnulib lib/{md5.c,md5.h} 的源代码文档。它们都是 MD5 (RFC 1321) 的实现。

在 gnulib 中,md5 block 由 32768 读取。

我对 md5 和 C 源代码了解不多。有人可以帮我解释这些结果吗?

我想问这个问题的另一个原因是,很多人理所当然地认为 md5sum 比 python_hashlib 快,他们在编写 python 代码时更喜欢使用 md5sum。但这似乎是错误的。

最佳答案

coreutils 有自己的 C 实现,而 python 使用特定于体系结构的程序集实现调用 libcrypto。 sha1 的差异更大。现在这已在 coreutils-8.22 中得到修复(当配置 --with-openssl 时),并在 Fedora 21、RHEL 7 和 Arch 等较新的发行版中启用。

请注意,尽管目前在某些系统上速度较慢,但​​调用命令是一种更好的长期策略,因为可以利用封装在单独命令中的所有逻辑,而不是重新实现。例如,在 coreutils 中,有待改进的稀疏文件读取支持,以便不会从内核等中冗余读取零。如果可能,最好透明地利用它。

关于python - 为什么 python hashlib.md5 比 linux coreutils md5sum 快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22624700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com