用于散列文件系统目录的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中的开源字典组件   即使在成功执行删除查询之后,java更新的列表也不会显示在jsp页面中   java Apache:无法启动上下文路径/网站上的失败应用程序   java验证CSV中的特定列   对于具有专用内存的java应用程序,最小堆大小低于最大堆大小有意义吗?   java将数组中的值转换为多维数组   java在给定程序中,垃圾收集器在对象被取消引用之前正在运行。。。使用jre 7(32位)   java在运行时动态刷新文件夹   eclipse如何解决“java.net.BindException:地址已在使用:JVM_Bind”错误?   Java数组与数组   每次任务完成任务时,Java多线程都会安排任务   java部分编译时使用maven编织第三方jar   java Dokku单一回购中的多个应用程序   用apachevelocity生成javac/C++语言文件   java如何使用spring应用程序上下文中的属性文件实例化列表   java访问智能卡文件结构   具有GlobalMethodSecurity的java自定义UserDetailService循环引用   java如何集成Spring和JSF