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 算法
3,653 每月下载量
用于 20 个crate(8 个直接使用)
130KB
2K SLoC
FastCDC
此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);
}
流式处理
两个模块v2016
和v2020
都有一个名为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
(通过功能标志支持tokio
和futures
)并使用一个容量等于指定最大分块大小的字节数组。
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中详细说明。
其他实现
- jrobhoward/quickcdc
- 同一作者的一些人的类似但稍早的算法?
- rdedup_cdc at docs.rs
- Rust中的另一种实现。
- ronomon/deduplication
- FastCDC的变体的C++和JavaScript实现。
- titusz/fastcdc-py
- 纯Python版本的FastCDC。与此实现兼容。
- wxiacode/FastCDC-c
- 使用齿轮表生成和掩码值的C中的规范算法。
- wxiacode/restic-FastCDC
- 具有额外掩码值的Go中的一种替代实现。
依赖项
~0–1.4MB
~25K SLoC