用于散列文件系统目录的python模块和cli。
dirhash的Python项目详细描述
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
代码。
提高性能的主要工作是支持多处理,其中 读取和散列是在单个文件上并行的。
作为参考,让我们比较一下dirhash
CLI
使用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的二叉树中。
Implementation | Test Case | Time (s) | Speed up |
---|---|---|---|
shell reference | flat_1k_1MB | 2.29 | -> 1.0 |
^{ | flat_1k_1MB | 1.67 | 1.36 |
^{ | flat_1k_1MB | 0.48 | 4.73 |
shell reference | nested_32k_32kB | 6.82 | -> 1.0 |
^{ | nested_32k_32kB | 3.43 | 2.00 |
^{ | nested_32k_32kB | 1.14 | 6.00 |
基准测试运行的是MacBookPro(2018),更多细节和源代码here。
文件
请参考dirhash -h
和python source code。