15个稳定版本 (3个主要版本)

3.1.0 2023年7月15日
3.0.3 2023年3月30日
3.0.0 2023年1月27日
2.0.0 2023年1月14日
0.1.0 2019年2月6日

#48 in 算法

Download history 1849/week @ 2024-03-25 1491/week @ 2024-04-01 1066/week @ 2024-04-08 948/week @ 2024-04-15 693/week @ 2024-04-22 892/week @ 2024-04-29 1082/week @ 2024-05-06 1227/week @ 2024-05-13 1239/week @ 2024-05-20 998/week @ 2024-05-27 1302/week @ 2024-06-03 972/week @ 2024-06-10 1130/week @ 2024-06-17 714/week @ 2024-06-24 748/week @ 2024-07-01 988/week @ 2024-07-08

3,653 每月下载量
用于 20 个crate(8 个直接使用)

MIT 许可证

130KB
2K SLoC

FastCDC docs.rs Crates.io 测试

此crate包含“FastCDC”内容定义分块算法的多个实现,该算法最初由Wen Xia等人在2016年描述,后来在2020年得到增强。其行为的一个关键方面是,它对相同的输入返回完全相同的结果。有关内容定义分块及其应用的更多信息,请参阅下面的参考材料。

需求

  • Rust 稳定版 (2018版)

构建和测试

$ cargo clean
$ cargo build
$ cargo test

示例用法

示例可以在源代码仓库的examples目录中找到,演示在给定文件中查找分块边界。既有流式处理示例,也有非流式处理示例,其中非流式处理示例使用memmap2 crate有效地读取大文件。

$ cargo run --example v2020 -- --size 16384 test/fixtures/SekienAkashita.jpg
    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
     Running `target/debug/examples/v2020 --size 16384 test/fixtures/SekienAkashita.jpg`
hash=17968276318003433923 offset=0 size=21325
hash=4098594969649699419 offset=21325 size=17140
hash=15733367461443853673 offset=38465 size=28084
hash=4509236223063678303 offset=66549 size=18217
hash=2504464741100432583 offset=84766 size=24700

非流式处理

使用FastCDC在内存中加载数据中查找分块边界的示例

let contents = std::fs::read("test/fixtures/SekienAkashita.jpg").unwrap();
let chunker = fastcdc::v2020::FastCDC::new(&contents, 16384, 32768, 65536);
for chunk in chunker {
    println!("offset={} length={}", chunk.offset, chunk.length);
}

流式处理

两个模块v2016v2020都有一个名为StreamCDC的FastCDC流式处理版本,它接受一个Read并使用一个容量等于指定最大分块大小的字节数组。

let source = std::fs::File::open("test/fixtures/SekienAkashita.jpg").unwrap();
let chunker = fastcdc::v2020::StreamCDC::new(source, 4096, 16384, 65535);
for result in chunker {
    let chunk = result.unwrap();
    println!("offset={} length={}", chunk.offset, chunk.length);
}

异步流式处理

模块v2020有一个名为AsyncStreamCDC的异步流式处理FastCDC版本,它接受一个AsyncRead(通过功能标志支持tokiofutures)并使用一个容量等于指定最大分块大小的字节数组。

let source = std::fs::File::open("test/fixtures/SekienAkashita.jpg").unwrap();
let chunker = fastcdc::v2020::AsyncStreamCDC::new(&source, 4096, 16384, 65535);
let stream = chunker.as_stream();
let chunks = stream.collect::<Vec<_>>().await;

for result in chunks {
    let chunk = result.unwrap();
    println!("offset={} length={}", chunk.offset, chunk.length);
}

从3.0之前的迁移

如果您之前使用的是3.0版本之前的这个crate版本,您需要做一些小的调整才能继续使用与之前相同的实现。

在3.0版本之前

let chunker = fastcdc::FastCDC::new(&contents, 8192, 16384, 32768);

在3.0版本之后

let chunker = fastcdc::ronomon::FastCDC::new(&contents, 8192, 16384, 32768);

生成的切割点将与之前的版本相同,因为ronomon实现从未以这种方式改变。请注意,然而,其他实现产生不同的结果。

参考资料

2016年的原始算法在FastCDC: a Fast and Efficient Content-Defined Chunking Approach for Data Deduplication中描述,而2020年改进的“每次滚动两个字节”版本在The Design of Fast Content-Defined Chunking for Data Deduplication Based Storage Systems中详细说明。

其他实现

依赖项

~0–1.4MB
~25K SLoC