#content-defined #cdc #hash #split #rolling #incremental

hash-roll

滚动哈希 & 内容定义分块(cdc)

3个版本 (破坏性更新)

0.3.0 2020年8月17日
0.2.0 2017年5月18日
0.1.1 2016年2月25日

#624算法

Download history 71/week @ 2024-03-11 10/week @ 2024-03-18 10/week @ 2024-03-25 102/week @ 2024-04-01 1/week @ 2024-04-08 46/week @ 2024-04-29 13/week @ 2024-05-06 12/week @ 2024-05-13 9/week @ 2024-05-20 3/week @ 2024-05-27 12/week @ 2024-06-03 74/week @ 2024-06-10 44/week @ 2024-06-17 32/week @ 2024-06-24

每月162次下载

AGPL-3.0

99KB
2K SLoC

hash-roll

Documentation Crates.io Travis

提供了一种通用的API,用于抽象化内容定义分块的各种实现。同时提供了多种内容定义分块算法的实现。

Rust中可用的分块选项比较

指标

  • DER:重复消除比率

CDC参考文献


lib.rs:

hash-roll提供各种内容定义分块算法

内容定义分块(CDC)算法是检查输入字节流(通常表示为切片,如 [u8])并在此输入流中提供拆分或分块位置的算法。

CDC算法通常试图优化以下方面

  1. 处理速度(即:每秒字节数)
  2. 即使在插入/删除字节的情况下,拆分位置也具有稳定性
  3. 合理的块长度分布

API概念

  • 配置算法实例(实现 Chunk)。通常简单地命名(如 [Bup])。这些可以被视为算法的“参数”。
  • 增量(实现 ChunkIncr)。通常带有 Incr 后缀。

由于可能以不同的方式使用CDC,以及不同的CDC算法特性,hash-roll提供了几种使用它们的方法。

配置算法实例是从给定算法所需的配置集合中创建的。例如,这可能意味着配置窗口大小或如何决定拆分的位置。这些不包含任何可变数据,换句话说:它们不跟踪提供给它们的数据。配置算法实例提供一次性API,以及获取其他类型API的方法,如增量样式API。

CDC算法和窗口缓冲区

不同的CDC算法对处理数据的方式有不同的限制。值得注意的是,一些算法需要大量先前处理过的数据来处理额外的数据。这种“大量先前处理过的数据”通常被称为“窗口”。也就是说,请注意,一些使用窗口概念的CDC算法不需要先前访问的数据。

对于窗口缓冲算法,某些类型的API实现会带来额外的开销。文档将注明这些情况并提出替代方案。

通常,增量式CDC接口在窗口缓冲算法中会较慢。使用显式分配接口(会输出Vec<u8>Vec<Vec<u8>>)的性能不会比增量式API差,但可能更方便。使用一次性API将提供最佳性能,因为它不需要任何缓冲(可以直接使用输入数据)。

驱动API选择的用例

  • 累积向量,输出向量

    • 增量式:是
    • 输入:Vec<u8>
    • 内部状态:Vec<Vec<u8>>
    • 输出:Vec<Vec<u8>>
  • 通过流式数据传输

    • 增量式:是
    • 输入:&[u8]
  • mmap(或读取整个)文件,输出

    • 增量式:否
    • 输入:&[u8]
    • 输出:&[u8]

依赖项