Slice-by-8 Crates.io Crates.io

Rust improved implementation of the Slice-by-8 intel algorithm from the paper "A Systematic Approach to building High Performance, Software-based, CRC Generators By Intel Researche and Development"

Slice-by-8 do not load the standard library (a.k.a #![no_std])

Status

Build Clippy docs.rs

Test codecov

Introduction

Slice-by-8 crate provides function that performs CRC hashing using improved variant of intel's Slice-by-8 algorithm. The crate provides the slice-by-8 algorithm that take the loopup table to use as parameter if you want to use your own. The crate also provides the CRC32 (Polynomial 0x04c11db7 ) available in slice_by_8::crc32 and the CRC32c (Polynomial 0x1EDC6F41 ) in slice_by_8::crc32c. CRC32c hash can use CRC32c intrinsics if enabled. You can enable intrinsic version on x86_64 targetarch by enabling sse4.2 targetfeature or on aarch64 targetarch by enabling crc targetfeature.

Usage

Using Hasher

```rust use sliceby8::crc32::CRC32BuildHasher; use std::collections::HashMap; const KEY: &str = "hash"; const VALUE: &str = "me!";

// Create a HashMap that use CRC32Hasher to hash keys let mut map = HashMap::with_hasher(CRC32BuildHasher::default()); map.insert(KEY, VALUE);

assert_eq!(map.get(&KEY), Some(&VALUE)); ```

Using slice-by-8 functions

Slice-by-8 provides functions to hash slice of bytes.

```rust use sliceby8::crc32c;

const HASHME: &[u8] = b"abcdefghijklmnopqrstuvwxyz"; asserteq!(crc32c::sliceby8(HASH_ME), 0x9EE6EF25); ```

Note: slice_by_8 is a similar to slice_by_8_with_seed with seed equals 0.

Using your own lookup table

You own lookup table must be [[u32; 256]; 8].

```rust use sliceby8::sliceby8;

let mylookuptable: [[u32; 256]; 8] = sliceby8::generatetable(sliceby8::crc32::POLYNOMIAL); const HASHME: &[u8] = b"abcdefghijklmnopqrstuvwxyz";

asserteq!(sliceby8(HASHME, &mylookuptable), 0x4C2750BD); ```

Generate Lookup table

The crate provide generate_table function to generate a lookup table from a polynomial.

```rust use sliceby8::generatetable; use sliceby_8::{crc32, crc32c};

asserteq!(generatetable(crc32::POLYNOMIAL), crc32::LOOKUPTABLE); asserteq!(generatetable(crc32c::POLYNOMIAL), crc32c::LOOKUPTABLE); ```

Performance

Improvement are based on :