#directory-tree #hash #hashing #single #utility #path

bin+lib dasher

将整个目录树缩减为一个单一哈希摘要的工具

5 个版本

0.3.3 2023年3月6日
0.3.2 2023年3月3日
0.3.1 2023年3月3日
0.3.0 2023年3月3日
0.2.0 2023年3月3日

##1271 in 文件系统

24 每月下载量

Apache-2.0 OR MIT

20KB
254

速记器

目录 速记器

dasher 是一个小工具,旨在允许您将整个目录树的“状态”缩减为一个单一的哈希摘要。因此,如果您发现哈希值已更改,则可以确定树中已更改了 某些内容(但无法确定是哪些内容)。

dasher 当前仅使用并支持 SHA3-256 哈希算法,但将来可能还会添加更多。

安装

dasher 最容易通过 Cargo 进行安装

$ cargo install dasher

当然,您也可以克隆此存储库并使用 cargo build/cargo run 来编译和运行代码。

用法

dasher 拥有一个非常简单的命令行界面,类似于其他哈希工具,如 sha1sum。只需用一条或多条路径调用 dasher,它将为每个路径返回哈希值。

$ dasher src test_data
6a181e4113e4c2abf39ada58158772316fe0444d3476c084759148fdd5be7e8c        src
3b5e49ac9126759771d677bdacbc18a63ff94ad4e07718c18347254d7b9c6cb1        test_data

哈希方案

哈希方案本质上是在生成一个 Merkle 树 的基础上增加了一些步骤。目录树中的每个节点都会对其名称进行哈希处理,然后是内容,然后将这些哈希值与基于节点类型的分隔字节连接起来,并再次进行哈希处理以生成节点的哈希值。这个过程从目录树的底部向上重复进行,直到所有节点都已哈希处理,并可以返回整个目录的最终哈希值。

对于正常的 文件,节点哈希很简单

hash(hash(name) + byte + hash(content))

对于 目录,节点哈希包括任意数量的内容哈希,每个子节点一个

hash(hash(name) + byte + hash(content_1) + byte + hash(content_2) + ... + byte + hash(content_n))

最后,对于 符号链接,不会跟随链接。相反,内容哈希是链接指向的文件的路径的哈希值。

hash(hash(name) + byte + hash(path))

目录的遍历 不是 递归的 —— 而是过程从字典序上“第一个”目录的叶子开始。例如,在以下目录

.git
├── COMMIT_EDITMSG
├── config
├── info
│   └── exclude
└── logs
    ├── HEAD
    └── refs
        ├── heads
        │   ├── add-cli
        │   ├── dh-main
        │   └── main
        └── remotes
            └── origin
                └── main

待散列的第一个项目将是 info/exclude,接着是 info 目录的哈希值。之后,将散列 logs/refs/heads/*,然后是 logs/refs/heads/remotes/origin/main,接着是 logs/refs/heads/remotes/origin 作为目录,然后是 logs/refs/heads/remotes 作为目录,最后返回散列 logs/refs,因为其子目录已经被散列。

从某种意义上说,你可能认为这是一个递归过程,但它并没有实现递归。

许可证

dasher 使用以下任一许可证:

由您选择。

它怎么样?

是的。

依赖项

~1.3–8.5MB
~54K SLoC