#crc32 #crc #crc-8 #crc64 #crc16 #data-processing #lookup-tables

crcxx

该crate使用多种方法计算CRC-8/16/32/64/128,包含的CRC参数目录简化了使用。

2个版本

0.3.1 2023年2月26日
0.3.0 2023年2月26日
0.2.1 2020年4月24日
0.2.0 2020年4月20日

算法分类中排名第694

每月下载量21

Apache-2.0

140KB
3.5K SLoC

crcxx

Crate API License Windows Build Status

该crate使用多种方法计算CRC-8/16/32/64/128,包含的CRC参数目录简化了使用。适用于从小型嵌入式系统到现代桌面和服务器。没有不安全或架构特定代码。

不使用查找表,每步处理一个字节

最慢的方法。不需要额外的内存。

use crcxx::crc32::{*, catalog::CRC_32_BZIP2};

const CRC: Crc<NoLookupTable> =
    Crc::<NoLookupTable>::new(&CRC_32_BZIP2);

fn main() {
    // singlepart data.
    let crc = CRC.compute(b"123456789");
    assert_eq!(crc, 0xFC89_1918);

    // Multipart data.
    let mut multipart = CRC.compute_multipart();
    multipart.update(b"1234");
    multipart.update(b"5678");
    multipart.update(b"9");

    let crc = multipart.value();
    assert_eq!(crc, 0xFC89_1918);
}

使用32个条目的查找表进行处理,每步处理一个字节

对于小型嵌入式设备,在速度和内存消耗之间取得良好平衡。根据使用场景,通常比前一种方法快2-5倍。

use crcxx::crc32::{*, catalog::CRC_32_BZIP2};

const CRC: Crc<LookupTable32> =
    Crc::<LookupTable32>::new(&CRC_32_BZIP2);

fn main() {
    // singlepart data.
    let crc = CRC.compute(b"123456789");
    assert_eq!(crc, 0xFC89_1918);

    // Multipart data.
    let mut multipart = CRC.compute_multipart();
    multipart.update(b"1234");
    multipart.update(b"5678");
    multipart.update(b"9");

    let crc = multipart.value();
    assert_eq!(crc, 0xFC89_1918);
}

使用256个条目的查找表进行处理,每步处理一个字节

根据使用场景,通常比前一种方法快不超过2倍。

use crcxx::crc32::{*, catalog::CRC_32_BZIP2};

const CRC: Crc<LookupTable256> =
    Crc::<LookupTable256>::new(&CRC_32_BZIP2);

fn main() {
    // singlepart data.
    let crc = CRC.compute(b"123456789");
    assert_eq!(crc, 0xFC89_1918);

    // Multipart data.
    let mut multipart = CRC.compute_multipart();
    multipart.update(b"1234");
    multipart.update(b"5678");
    multipart.update(b"9");

    let crc = multipart.value();
    assert_eq!(crc, 0xFC89_1918);
}

使用256 x SLICES个条目的查找表进行处理,每步处理多个字节

在无需使用架构特定指令的情况下,对于现代桌面和服务器上处理大量数据的最终方法。根据使用场景(更倾向于更大的块),通常比前一种方法快6倍。建议的切片数量为16。从16到32通常只有不到10%的改进。

use crcxx::crc32::{*, catalog::CRC_32_BZIP2};

const SLICES: usize = 16;
const CRC: Crc<LookupTable256xN<SLICES>> =
    Crc::<LookupTable256xN<SLICES>>::new(&CRC_32_BZIP2);

fn main() {
    // singlepart data.
    let crc = CRC.compute(b"123456789");
    assert_eq!(crc, 0xFC89_1918);

    // Multipart data.
    let mut multipart = CRC.compute_multipart();
    multipart.update(b"1234");
    multipart.update(b"5678");
    multipart.update(b"9");

    let crc = multipart.value();
    assert_eq!(crc, 0xFC89_1918);
}

MSRV

当前的MSRV是1.59。请注意,官方crate策略是最新稳定版。

许可证

本项目根据Apache 2.0许可证授权。

无运行时依赖