#simd #checksum #fletchers

nightly fletcher-simd

Fletcher校验和算法的SIMD实现

5个版本 (3个重大更改)

0.4.0 2022年11月8日
0.3.0 2022年3月2日
0.2.0 2022年3月1日
0.1.1 2022年2月19日
0.1.0 2022年2月15日

#2514 in 算法

BSD-2-Clause

14KB
217 代码行

fletcher-simd

crates.io crates.io docs.rs

Fletcher校验和算法的SIMD实现。

注意:此实现使用模数 2^k,其中 k 是校验和块大小(位),因为这可以通过包装数学快速完成。其他实现可能使用 2^k - 1

功能

  • 使用 std::simd,当前需要 nightly
  • 支持 std::simd 支持的所有架构。
  • 通过 multiversion 包提供运行时和编译时检测。
  • 标量回退。

Cargo功能

有一个默认启用的 cargo 功能,runtime_dispatch。启用时,包将在运行时使用CPU功能检测来调度适当的SIMD实现。禁用此功能将仅进行静态调度。

示例

use byteorder::{ByteOrder, LittleEndian};
use fletcher_simd::Fletcher128;

fn main() {
    const DATA: &str = "abcdefgh";
    let mut fletcher = Fletcher128::new();

    // Read bytes in little endian. Endianness matters!
    fletcher.update_with_iter(
        DATA.as_bytes()
            .chunks(8)
            .map(|chunk| LittleEndian::read_u64(chunk)),
    );

    assert_eq!(fletcher.value(), 0x68676665646362616867666564636261);
}

依赖项

~2MB
~45K SLoC