7 releases (3 stable)
1.1.0 | May 30, 2024 |
---|---|
1.0.1 | Jul 7, 2023 |
1.0.0 | Jun 2, 2023 |
0.5.1 | Dec 30, 2021 |
0.1.0 |
|
#166 in Cryptography
659 downloads per month
Used in nftver
250KB
212 lines
paq
Hash file or directory recursively.
Powered by blake3
cryptographic hashing algorithm.
Performance
The go programming language repository was used as a test case (478 MB / 12,540 files).
Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
---|---|---|---|---|
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 |
Performance benchmark uses hyperfine.
Commands with shell
use the following command with various <hashsum>
implementations:
find ./go -type f -print0 | LC_ALL=C sort -z | xargs -0 <hashsum> | <hashsum>
Installation
Cargo Install
Installation requires cargo.
Install From Crates.io
cargo install paq
Install From Repository Clone
- Clone this repository.
- Run
cargo install --path .
from repository root.
Pre-Built Binary Package
- Find Latest Release
.zip
archive for computer Operating System and Architecture. - Download and extract
.zip
. - Modify permissions of the extracted
paq
binary to allow execution. - Move
paq
to a system path.
Usage
Command Line Interface executable or Crate library.
Included in this repository is an example directory containing some sample files, a subdirectory and a symlink to test paq
functionality.
Executable
Run paq [src]
to hash source file or directory.
Output hash to .paq
file as valid JSON.
For help, run paq --help
.
Hash Example Directory
paq ./example
Path to example directory can be relative or absolute.
Expect different results if -i
or --ignore-hidden
flag argument is used.
Crate Library
Add paq
to project dependencies in Cargo.toml
.
Use Library
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);
Hash Example Directory
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");
Expect different results if ignore_hidden
is set to false
.
Content Limitations
Hashes are generated using file system content as input data to the blake3
hashing algorithm.
By design, paq
does NOT include file system metadata in hash input such as:
- File modes
- File ownership
- File modification and access times
- File ACLs and extended attributes
- Hard links
- Symlink target contents (target path is hashed)
Additionally, files or directory contents starting with dot or full stop can optionally be ignored.
How it Works
- Recursively get path(s) for a given source argument.
- Hash each path and file contents if path is to a file.
- Sort the list of hashes for consistent ordering.
- Compute the final hash by hashing the list of hashes.
License
Dependencies
~3–10MB
~121K SLoC