All Projects → rust-rse → reed-solomon-erasure

rust-rse / reed-solomon-erasure

Licence: MIT license
[Looking for new owners/maintainers, see #88] Rust implementation of Reed-Solomon erasure coding

Programming Languages

rust
11053 projects
c
50402 projects - #5 most used programming language
typescript
32286 projects
Sage
50 projects

Projects that are alternatives of or similar to reed-solomon-erasure

go-erasure
Erasure coding (Reed–Solomon coding) in Go
Stars: ✭ 44 (-67.41%)
Mutual labels:  reed-solomon, erasure-coding
blockyarchive
Blocky archive - multithreaded archiver offering bit rot protection and sector level recoverability
Stars: ✭ 88 (-34.81%)
Mutual labels:  reed-solomon
Tinyfecvpn
A VPN Designed for Lossy Links, with Build-in Forward Error Correction(FEC) Support. Improves your Network Quality on a High-latency Lossy Link.
Stars: ✭ 1,842 (+1264.44%)
Mutual labels:  reed-solomon
Udpspeeder
A Tunnel which Improves your Network Quality on a High-latency Lossy Link by using Forward Error Correction, possible for All Traffics(TCP/UDP/ICMP)
Stars: ✭ 3,699 (+2640%)
Mutual labels:  reed-solomon
schifra
C++ Reed Solomon Error Correcting Library https://www.schifra.com
Stars: ✭ 28 (-79.26%)
Mutual labels:  reed-solomon
galois
A performant NumPy extension for Galois fields and their applications
Stars: ✭ 106 (-21.48%)
Mutual labels:  reed-solomon
ParPar
High performance PAR2 create client for NodeJS
Stars: ✭ 110 (-18.52%)
Mutual labels:  reed-solomon
Seaweedfs
SeaweedFS is a fast distributed storage system for blobs, objects, files, and data lake, for billions of files! Blob store has O(1) disk seek, cloud tiering. Filer supports Cloud Drive, cross-DC active-active replication, Kubernetes, POSIX FUSE mount, S3 API, S3 Gateway, Hadoop, WebDAV, encryption, Erasure Coding.
Stars: ✭ 13,380 (+9811.11%)
Mutual labels:  erasure-coding
Glusterfs
Gluster Filesystem : Build your distributed storage in minutes
Stars: ✭ 3,437 (+2445.93%)
Mutual labels:  erasure-coding
liberasurecode
A Rust wrapper for `openstack/liberasurecode`
Stars: ✭ 19 (-85.93%)
Mutual labels:  erasure-coding
hw offload api examples
Examples of usage for Mellanox HW offloads
Stars: ✭ 13 (-90.37%)
Mutual labels:  erasure-coding
archistar-smc
Secret sharing library in Java for the Archistar multi-cloud storage system
Stars: ✭ 44 (-67.41%)
Mutual labels:  erasure-coding

reed-solomon-erasure

Build Status Build status codecov Coverage Status Crates Documentation dependency status

Rust implementation of Reed-Solomon erasure coding

WASM builds are also available, see section WASM usage below for details

This is a port of BackBlaze's Java implementation, Klaus Post's Go implementation, and Nicolas Trangez's Haskell implementation.

Version 1.X.X copies BackBlaze's implementation, and is less performant as there were fewer places where parallelism could be added.

Version >= 2.0.0 copies Klaus Post's implementation. The SIMD C code is copied from Nicolas Trangez's implementation with minor modifications.

See Notes and License section for details.

WASM usage

See here for details

Rust usage

Add the following to your Cargo.toml for the normal version (pure Rust version)

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

or the following for the version which tries to utilise SIMD

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

and the following to your crate root

extern crate reed_solomon_erasure;

NOTE: simd-accel is tuned for Haswell+ processors on x86-64 and not in any way for other architectures, set environment variable RUST_REED_SOLOMON_ERASURE_ARCH during build to force compilation of C code for specific architecture (-march flag in GCC/Clang). Even on x86-64 you can achieve better performance by setting it to native, but it will stop running on older CPUs, YMMV.

Example

#[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);
}

Benchmark it yourself

You can test performance under different configurations quickly (e.g. data parity shards ratio, parallel parameters) with standard cargo bench command.

Performance

Version 1.X.X, 2.0.0 do not utilise SIMD.

Version 2.1.0 onward uses Nicolas's C files for SIMD operations.

Machine: laptop with Intel(R) Core(TM) i5-3337U CPU @ 1.80GHz (max 2.70GHz) 2 Cores 4 Threads

Below shows the result of one of the test configurations, other configurations show similar results in terms of ratio.

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

Versions >= 4.0.0 have not been benchmarked thoroughly yet

Benchmarking

You can run benchmarks via cargo bench. To enable simd acceleration during benchmarks use cargo bench --features simd-accel.

Changelog

Changelog

Contributions

Contributions are welcome. Note that by submitting contributions, you agree to license your work under the same license used by this project as stated in the LICENSE file.

Credits

Library overhaul and Galois 2^16 backend

Many thanks to the following people for overhaul of the library and introduction of Galois 2^16 backend

WASM builds

Many thanks to Nazar Mokrynskyi @nazar-pc for submitting his package for WASM builds

He is the original author of the files stored in wasm folder. The files may have been modified by me later.

AVX512 support

Many thanks to @sakridge for adding support for AVX512 (see PR #69)

build.rs improvements

Many thanks to @ryoqun for improving the usability of the library in the context of cross-compilation (see PR #75)

no_std support

Many thanks to Nazar Mokrynskyi @nazar-pc for adding no_std support (see PR #90)

Testers

Many thanks to the following people for testing and benchmarking on various platforms

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

  • Roger Andersen @hexjelly (platforms: Windows, AMD)

Notes

Code quality review

If you'd like to evaluate the quality of this library, you may find audit comments helpful.

Simply search for "AUDIT" to see the dev notes that are aimed at facilitating code reviews.

Implementation notes

The 1.X.X implementation mostly copies BackBlaze's Java implementation.

2.0.0 onward mostly copies Klaus Post's Go implementation, and copies C files from Nicolas Trangez's Haskell implementation.

The test suite for all versions copies Klaus Post's Go implementation as basis.

License

Nicolas Trangez's Haskell Reed-Solomon implementation

The C files for SIMD operations are copied (with no/minor modifications) from Nicolas Trangez's Haskell implementation, and are under the same MIT License as used by NicolasT's project

TL;DR

All files are released under the MIT License

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].