用于散列文件系统目录的python模块和cli。

dirhash的Python项目详细描述


Build Statuscodecov

dirhash

一个轻量级的python模块和工具,用于计算任何 基于文件结构和内容的目录。

  • 支持python内置模块的任何哈希算法hashlib
  • .gitignore样式的“wildmatch”模式,用于对 包括/排除。
  • 最多可进行6x speed-up

安装

git clone git@github.com:andhus/dirhash.git
pip install dirhash/

用法

python模块:

fromdirhashimportdirhashdirpath='path/to/directory'dir_md5=dirhash(dirpath,'md5')filtered_sha1=dirhash(dirpath,'sha1',ignore=['.*','.*/','*.pyc'])pyfiles_sha3_512=dirhash(dirpath,'sha3_512',match=['*.py'])

客户端:

dirhash path/to/directory -a md5
dirhash path/to/directory -a sha1 -i ".*  .*/  *.pyc"
dirhash path/to/directory -a sha3_512 -m "*.py"

为什么?

如果您(或您的应用程序)还需要验证一组文件的完整性 作为他们的名字和位置,你可能会发现这很有用。用例范围从 验证图像分类数据集(在花费GPU-$$之前 培训您的高级深入学习模型)以验证 回归测试。

这并不是一个标准的方法。有很多食谱 在这里(参见这些SO问题 以及python) 但我找不到一个经过适当测试的(有一些问题需要掩盖!) 并以引人注目的用户界面记录下来。dirhash的创建方式如下 目标。

checksumdir是另一条Python 具有类似意图的模块/工具(激发了这个项目),但是它缺少 此处提供的功能(最显著的是在散列中包含文件名/结构) 而且缺乏测试。

性能

常用哈希算法的pythonhashlib实现高度 优化。dirhash主要解析文件树,将数据传递到hashlib和 合并输出已经采取了合理的措施来减少间接费用 对于常见的用例,大部分时间都花在从磁盘读取数据上 执行hashlib代码。

提高性能的主要工作是支持多处理,其中 读取和散列是在单个文件上并行的。

作为参考,让我们比较一下dirhashCLI 使用shell命令:

find path/to/folder -type f -print0 | sort -z | xargs -0 md5 | md5

这是SO问题的最高答案: Linux: compute a single hash for a given folder & contents? 两个测试用例的结果如下所示。两者都有1 gib的随机数据:in “flat_1k_1MB”,在一个平面结构中分成1k个文件(每个文件1 MIB),并在 “nested_32k_32kb”,分成32k个文件(每个文件32 kib),分布在256个叶目录上 在深度为8的二叉树中。

ImplementationTest CaseTime (s)Speed up
shell referenceflat_1k_1MB2.29-> 1.0
^{}flat_1k_1MB1.671.36
^{}(8 workers)flat_1k_1MB0.484.73
shell referencenested_32k_32kB6.82-> 1.0
^{}nested_32k_32kB3.432.00
^{}(8 workers)nested_32k_32kB1.146.00

基准测试运行的是MacBookPro(2018),更多细节和源代码here

文件

请参考dirhash -h和python source code

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java通过Spring MVC web应用程序向客户端发送文本文件   java是否可以在运行时动态实例化DAO类?   调用VB。来自Java的net函数   java在Android中通过单击打开特定文件夹   java如何使用maven pom。xml标识非标准项目结构中的testng测试用例?   java为什么FOP在大文件上崩溃?   Architecture python+flask和spring boot+java   java Kafka工具根本没有启动Ubuntu 19.10   如何使用Eclipse运行Java USB API for Windows   java如何在Eclipse中查看J2EE预览服务器/容器的日志/控制台?   网页抓取是否可以使用Java crawler crawler4j暂停和恢复抓取?   java当我第二次按下按钮时,应用程序停止工作   带有偏移量和限制的java SQLite分页问题   java如何在OSX mavericks中将端口80转发到8080   java从泛型方法调用非泛型方法   java My代码未按预期工作。十进制输出不是它应该的样子   节点。java中的js加密(jasypt)和nodejs中的解密   java乘法表不工作数组索引超出范围   java将JDBC与Firebirdsql连接起来