7 个版本 (3 个稳定版)
1.1.0 | 2024 年 5 月 30 日 |
---|---|
1.0.1 | 2023 年 7 月 7 日 |
1.0.0 | 2023 年 6 月 2 日 |
0.5.1 | 2021 年 12 月 30 日 |
0.1.0 |
|
#179 in 文件系统
用于 nftver
250KB
212 代码行
paq
递归哈希文件或目录。
由 blake3
密码学哈希算法提供支持。
性能
使用了 go 编程语言仓库作为测试用例(478 MB / 12,540 个文件)。
命令 | 平均值 [ms] | 最小值 [ms] | 最大值 [ms] | 相对 |
---|---|---|---|---|
paq./go |
116.4 ± 2.6 | 111.4 | 120.9 | 1.00 |
shell b3sum |
132.4 ± 1.5 | 129.6 | 135.9 | 1.14 ± 0.03 |
dirhash-a sha256./go |
642.5 ± 5.8 | 634.7 | 649.8 | 5.52 ± 0.13 |
shell sha256sum |
1583.0 ± 16.3 | 1568.6 | 1606.8 | 13.60 ± 0.33 |
使用 shell
的命令使用了以下命令和多种 <hashsum>
实现
find ./go -type f -print0 | LC_ALL=C sort -z | xargs -0 <hashsum> | <hashsum>
安装
Cargo 安装
安装需要 cargo。
从 Crates.io 安装
cargo install paq
从仓库克隆安装
- 克隆此仓库。
- 从仓库根目录运行
cargo install --path .
预构建的二进制包
- 找到适用于计算机操作系统和架构的 最新发布版
.zip
归档。 - 下载并解压缩
.zip
。 - 修改解压缩的
paq
二进制文件的权限,允许执行。 - 将
paq
移动到系统路径。
用法
命令行界面可执行文件或 Crate 库。
本仓库包含一个示例目录,其中包含一些示例文件、子目录以及一个软链接,用于测试 paq
的功能。
可执行文件
运行 paq [src]
来对源文件或目录进行哈希处理。
将哈希输出到 .paq
文件,格式为有效的 JSON。
如需帮助,运行 paq --help
。
哈希示例目录
paq ./example
示例目录的路径可以是相对路径或绝对路径。
如果使用了 -
或 --ignore-hidden
标志参数,可能会得到不同的结果。
库文件
将 paq
添加到 Cargo.toml
中的项目依赖项。
使用库
use paq;
let source = std::path::PathBuf::from("/path/to/source");
let ignore_hidden = true; // .dir or .file
let source_hash: paq::ArrayString<64> = paq::hash_source(&source, ignore_hidden);
println!("{}", source_hash);
哈希示例目录
use paq;
let source = std::path::PathBuf::from("example");
let ignore_hidden = true;
let source_hash: paq::ArrayString<64> = paq::hash_source(&source, ignore_hidden);
assert_eq!(&source_hash[..], "a593d18de8b696c153df9079c662346fafbb555cc4b2bbf5c7e6747e23a24d74");
如果将 ignore_hidden
设置为 false
,可能会得到不同的结果。
内容限制
哈希是通过将文件系统内容作为输入数据输入到 blake3
哈希算法中生成的。
按照设计,paq
不将文件系统元数据包括在哈希输入中,例如
- 文件模式
- 文件所有权
- 文件修改和访问时间
- 文件 ACLs 和扩展属性
- 硬链接
- 软链接目标内容(目标路径被哈希处理)
此外,以点或句点开头的文件或目录内容(可选)可以被忽略。
工作原理
- 递归获取给定源参数的路径。
- 如果路径指向文件,则对每个路径和文件内容进行哈希处理。
- 对哈希列表进行排序,以保持一致的顺序。
- 通过哈希哈希列表来计算最终的哈希。
许可证
依赖项
~4–11MB
~122K SLoC