24个稳定版本 (6个主要版本)

6.0.0 2022年9月23日
5.0.3 2022年5月28日
5.0.1 2021年12月17日
4.0.2 2020年4月6日
0.9.1 2017年12月17日

#36编码

Download history 25077/week @ 2024-03-14 23289/week @ 2024-03-21 22349/week @ 2024-03-28 26996/week @ 2024-04-04 26308/week @ 2024-04-11 31775/week @ 2024-04-18 29331/week @ 2024-04-25 29380/week @ 2024-05-02 29223/week @ 2024-05-09 26252/week @ 2024-05-16 24329/week @ 2024-05-23 23975/week @ 2024-05-30 22845/week @ 2024-06-06 23155/week @ 2024-06-13 20526/week @ 2024-06-20 16361/week @ 2024-06-27

87,822 每月下载量
用于 176 个crate(直接使用23个)

MIT 许可证

215KB
5K SLoC

reed-solomon-erasure

Build Status Build status codecov Coverage Status Crates Documentation dependency status

Rust实现的Reed-Solomon纠删码

还提供WASM构建版本,有关详细信息,请参阅下面的 WASM使用 部分

这是对BackBlaze的Java实现Klaus Post的Go实现Nicolas Trangez的Haskell实现的移植。

版本 1.X.X 复制了BackBlaze的实现,性能较低,因为可以添加并行的地方较少。

版本 >= 2.0.0 复制了Klaus Post的实现。SIMD C代码是从Nicolas Trangez的实现中复制的,并进行了一些修改。

有关详细信息,请参阅说明许可证部分。

WASM使用

有关详细信息,请参阅此处

Rust使用

要将以下内容添加到您的Cargo.toml中,用于正常版本(纯Rust版本)

[dependencies]
reed-solomon-erasure = "4.0"

或以下内容,用于尝试利用SIMD的版本

[dependencies]
reed-solomon-erasure = { version = "4.0", features = [ "simd-accel" ] }

并添加以下内容到您的crate根目录

extern crate reed_solomon_erasure;

注意:simd-accel针对x86-64上的Haswell+处理器进行了优化,不对其他架构进行任何优化,在构建时设置环境变量RUST_REED_SOLOMON_ERASURE_ARCH以强制编译特定架构的C代码(GCC/Clang中的-march标志)。即使在x86-64上,将其设置为native也可以实现更好的性能,但将在旧CPU上停止运行,YMMV。

示例

#[macro_use(shards)]
extern crate reed_solomon_erasure;

use reed_solomon_erasure::galois_8::ReedSolomon;
// or use the following for Galois 2^16 backend
// use reed_solomon_erasure::galois_16::ReedSolomon;

fn main () {
    let r = ReedSolomon::new(3, 2).unwrap(); // 3 data shards, 2 parity shards

    let mut master_copy = shards!(
        [0, 1,  2,  3],
        [4, 5,  6,  7],
        [8, 9, 10, 11],
        [0, 0,  0,  0], // last 2 rows are parity shards
        [0, 0,  0,  0]
    );

    // Construct the parity shards
    r.encode(&mut master_copy).unwrap();

    // Make a copy and transform it into option shards arrangement
    // for feeding into reconstruct_shards
    let mut shards: Vec<_> = master_copy.iter().cloned().map(Some).collect();

    // We can remove up to 2 shards, which may be data or parity shards
    shards[0] = None;
    shards[4] = None;

    // Try to reconstruct missing shards
    r.reconstruct(&mut shards).unwrap();

    // Convert back to normal shard arrangement
    let result: Vec<_> = shards.into_iter().filter_map(|x| x).collect();

    assert!(r.verify(&result).unwrap());
    assert_eq!(master_copy, result);
}

自行进行基准测试

您可以通过克隆此repo快速测试不同配置下的性能(例如,数据奇偶校验碎片比率、并行参数):https://github.com/darrenldl/rse-benchmark

rse-benchmark 包含了这个库的副本(通常是功能齐全的开发版本),所以你只需要调整 main.rs,然后执行 cargo run --release 来启动基准测试。

性能

版本 1.X.X2.0.0 不使用 SIMD。

从版本 2.1.0 开始使用 Nicolas 的 C 文件进行 SIMD 操作。

机器:搭载 Intel(R) Core(TM) i5-3337U CPU @ 1.80GHz (最大 2.70GHz) 2 核心 4 线程

以下显示了一种测试配置的结果,其他配置在比率方面显示相似的结果。

配置 Klaus Post 的 >= 2.1.0 && < 4.0.0 2.0.X 1.X.X
10x2x1M ~7800MB/s ~4500MB/s ~1000MB/s ~240MB/s

版本 >= 4.0.0 尚未进行全面基准测试

变更日志

变更日志

贡献

欢迎贡献。请注意,通过提交贡献,你同意按照 LICENSE 文件中所述的与本项目相同的许可证许可你的作品。

鸣谢

库重构和 Galois 2^16 后端

感谢以下人员对库的重构和引入 Galois 2^16 后端的贡献

WASM 构建

感谢 Nazar Mokrynskyi @nazar-pc 提交了他的 WASM 构建包

他是存储在 wasm 文件夹中的文件的原始作者。这些文件可能后来被我修改。

AVX512 支持

感谢 @sakridge 为添加 AVX512 支持(见 PR #69

build.rs 改进

感谢 @ryoqun 改进了库在交叉编译环境中的可用性(见 PR #75

no_std 支持

感谢 Nazar Mokrynskyi @nazar-pc 添加了 no_std 支持(见 PR #90

测试者

感谢以下人员在各种平台上进行测试和基准测试

  • Laurențiu Nicola @lnicola(平台:Linux,Intel)

  • Roger Andersen @hexjelly(平台:Windows,AMD)

备注

代码质量审查

如果你想评估这个库的质量,你可能觉得审计评论很有用。

只需搜索 "AUDIT" 来查看旨在促进代码审查的开发备注。

实现备注

1.X.X 实现主要复制了 BackBlaze 的 Java 实现

2.0.0 及以后版本主要复制了 Klaus Post 的 Go 实现,并复制了来自 Nicolas Trangez 的 Haskell 实现 的 C 文件。

所有版本的测试套件以 Klaus Post 的 Go 实现 为基础。

许可证

Nicolas Trangez 的 Haskell Reed-Solomon 实现

用于 SIMD 操作的 C 文件(无/微小修改)从 Nicolas Trangez 的 Haskell 实现 复制,并使用与 NicolasT 的项目相同的 MIT 许可证。

TL;DR

所有文件均以 MIT 许可证发布

依赖项

~1.4–2MB
~32K SLoC