#digest #data #hash #hashing

crev-recursive-digest

实现文件系统目录递归摘要的库

4 个版本 (破坏性更新)

0.6.0 2023 年 4 月 4 日
0.5.0 2021 年 7 月 31 日
0.4.0 2020 年 3 月 8 日
0.3.0 2020 年 3 月 8 日
0.1.1 2018 年 12 月 19 日

#518 in 文件系统

Download history 170/week @ 2024-03-13 259/week @ 2024-03-20 207/week @ 2024-03-27 243/week @ 2024-04-03 174/week @ 2024-04-10 189/week @ 2024-04-17 168/week @ 2024-04-24 133/week @ 2024-05-01 103/week @ 2024-05-08 207/week @ 2024-05-15 174/week @ 2024-05-22 170/week @ 2024-05-29 120/week @ 2024-06-05 109/week @ 2024-06-12 121/week @ 2024-06-19 121/week @ 2024-06-26

每月 487 次下载
用于 8 个 crates (5 个直接使用)

MPL-2.0 OR MIT OR Apache-2.0

16KB
297 行代码(不包括注释)

递归文件系统摘要

此库实现了一个简单但高效的递归文件系统摘要算法。您有一个包含一些内容的目录,并希望获取其内容的加密摘要(哈希)。

它最初是为了在 crev 中计算源代码包的校验和而创建的,但它具有通用性,可用于任何其他目的。

算法

给定任何摘要算法 H(哈希函数算法),一个 RecursiveDigest(H, path)

  • 对于文件: H("F" || file_content)
  • 对于符号链接: H("L" || symlink_content)
  • 对于目录: H("D" || directory_content)

如您所见,使用一个字母的 ASCII 前缀来确保不可能创建一个与目录等摘要相同的文件。这种方法的一个缺点是,简单文件的 RecursiveDigest(H, path) 与其普通的摘要不同(H(file_content))。

file_content 只是一个文件的字节内容。

symlink_content 只是指向符号链接的路径,以字节形式表示。

directory_content 是通过

  • 按名称对目录中的所有条目进行排序(升序),使用简单的字节序列比较来创建的
  • 对于所有条目连接成对
    • H(entry_name)
    • RecursiveDigest(H,entry_path)

如果使用可选的附加数据扩展,上面的H(entry_name)将变为H(entry_name || 0 || additional data)。附加数据的格式和意义未指定,但旨在用于文件系统元数据,如文件系统权限和所有权。

依赖关系

~0.7–8.5MB
~69K SLoC