#directory-tree #hash-tree #tree-hash #hash #tree #file-tree #checksum

merkle_hash

Finds the hashes of all files and directories in a directory tree

16 stable releases

3.6.1 Jan 27, 2024
3.5.0 Mar 24, 2023
3.2.0 Feb 27, 2023
3.1.0 Jan 31, 2023
1.1.1 Mar 31, 2022

#106 in Algorithms

Download history 25/week @ 2023-12-18 17/week @ 2023-12-25 49/week @ 2024-01-01 24/week @ 2024-01-08 13/week @ 2024-01-15 35/week @ 2024-01-22 24/week @ 2024-01-29 78/week @ 2024-02-05 45/week @ 2024-02-12 88/week @ 2024-02-19 148/week @ 2024-02-26 110/week @ 2024-03-04 240/week @ 2024-03-11 157/week @ 2024-03-18 39/week @ 2024-03-25 652/week @ 2024-04-01

1,096 downloads per month
Used in 7 crates

MIT license

25KB
469 lines

merkle_hash

Finds the hashes of all files and directories in a directory tree.

Usage

To use this crate, add merkle_hash as a dependency to your project's Cargo.toml:

[dependencies]
merkle_hash = "3.6"

Features

  • Finds the master hash of a directory tree with ease.
  • Offers multiple hashing algorithms.
  • Allows including names in the hashing process.
  • Uses a merkle tree algorithm to compute the hashes of directories.
  • External iteration over the paths and hashes of files and directories.

Limitations

  • Currently only supports UTF-8 paths and will fail if a path is not UTF-8 encoded.

Optional

  • sha - Add this cargo feature to include SHA-256 and SHA-512 as hashing algorithms.
  • parallel - Enabled by default, this feature makes the crate utilize all available threads.
  • encode - Enabled by default, this feature adds the bytes_to_hex and to_hex_string functions.
  • retain - Disabled by default, this feature duplicates the children paths of directories upon traversal.

Examples

Get the master hash of a directory tree:

use merkle_hash::{Algorithm, MerkleTree};

let tree = MerkleTree::builder("/path/to/directory")
    .algorithm(Algorithm::Blake3)
    .hash_names(false)
    .build()?;
let master_hash = tree.root.item.hash;

Iterate over a directory tree, getting the hash of each file and directory:

use merkle_hash::{Encodable, MerkleTree};

let tree = MerkleTree::builder("/path/to/directory").build()?;
for item in tree {
    println!("{}: {}", item.path.relative, item.hash.to_hex_string());
}

Collapse the tree into any linear collection:

use std::collections::BTreeSet;
use merkle_hash::{MerkleItem, MerkleTree};

let tree = MerkleTree::builder("/path/to/directory").build()?;
let btree_set: BTreeSet<MerkleItem> = tree.into_iter().collect();

Release notes for 3.6

  • The duplication of children paths for directories is now hidden behind the retain feature.
  • The functions for encoding a hash into a hexadecimal string have now been hidden behind the encode feature.

Versioning

  • Any major version of this crate may contain changes to the hashing algorithm.
  • Any minor version of this crate may contain breaking changes to the API.
  • Any patch version of this crate will only contain bug fixes and no breaking changes.

Used technologies

  • rayon for multithreaded directory reading and hashing.
  • camino to ensure that paths are always utf-8.
  • anyhow to ease-out the handling of errors.
  • blake3 for the blake3 hashing of file contents.
  • sha2 for the sha256 and sha512 hashing of file contents.

License

Licensed under MIT license.

Dependencies

~1.5–2.1MB
~50K SLoC