crev-recursive-digest

Crates.iocrev-recursive-digest
lib.rscrev-recursive-digest
version0.6.0
sourcesrc
created_at2018-12-09 06:25:11.717546
updated_at2023-04-04 20:36:34.40561
descriptionLibrary implementing recursive digest for filesystem directories
homepagehttps://github.com/crev-dev/cargo-crev/tree/master/recursive-digest
repositoryhttps://github.com/crev-dev/cargo-crev/tree/master/recursive-digest
max_upload_size
id100903
size49,864
Kornel (kornelski)

documentation

https://docs.rs/crev-recursive-digest

README

Recursive file-system digest

This library implements a simple but efficient recursive file-system digest algorithm. You have a directory with some content in it, and you'd like a cryptographical digest (hash) of its content.

It was created for the purpose of checksuming source code packages in crev, but it is generic and can be used for any other purpose.

Algorithm

Given any digest algorithm H (a Hash function algorithm), a RecursiveDigest(H, path) is:

  • for a file: H("F" || file_content)
  • for a symlink: H("L" || symlink_content)
  • for a directory: H("D" || directory_content)

As you can see a one-letter ASCII prefix is used to make it impossible to create a file that has the same digest as a directory, etc. The drawback of this approach is that RecursiveDigest(H, path) of a simple file is not the same as just a normal digest of it (H(file_content)) .

file_content is just the byte content of a file.

symlink_content is just the path the symlink is pointing to, as bytes.

directory_content is created by:

  • sorting all entries of a directory by name, in ascending order, using a simple byte-sequence comparison
  • for all entries concatenating pairs of:
    • H(entry_name)
    • RecursiveDigest(H, entry_path)

If optional additional data extensions is used, the H(entry_name) above becomes H(entry_name || 0 || additional data). The format and meaning of additional data is unspecified, but was intendet for fielsystem metadata like file system permissions and ownership.

Commit count: 1385

cargo fmt