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 每月下载量
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
使用以下任一许可证:
- Apache License, Version 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
它怎么样?
依赖项
~1.3–8.5MB
~54K SLoC