#校验和 #数据完整性 #错误 #检查 #免费 # #算法

无std fletcher

弗莱彻校验和算法的无依赖实现

4个版本 (破坏性更新)

使用旧的Rust 2015

0.3.0 2021年12月29日
0.2.0 2021年10月2日
0.1.0 2020年4月24日
0.0.1 2017年8月9日

#1046 in 算法

Download history 567/week @ 2024-03-14 650/week @ 2024-03-21 1269/week @ 2024-03-28 1158/week @ 2024-04-04 616/week @ 2024-04-11 515/week @ 2024-04-18 523/week @ 2024-04-25 649/week @ 2024-05-02 455/week @ 2024-05-09 402/week @ 2024-05-16 382/week @ 2024-05-23 458/week @ 2024-05-30 428/week @ 2024-06-06 380/week @ 2024-06-13 565/week @ 2024-06-20 306/week @ 2024-06-27

1,762 每月下载量
用于 cxl_rs

MIT 许可证

17KB
322

fletcher

弗莱彻校验和算法的无依赖实现

crates.io example workflow

弗莱彻校验和是为了提供与CRC类似的错误检查能力,但具有更快的软件实现。这不是一个加密安全的校验和,它仅用于检查数据的完整性,而不是真实性。

算法优点

此算法在软件中运行的比大多数CRC算法都要快。这是因为CRC算法最初是为了便于在硬件中实现而设计的,但并不一定适合在软件中实现。弗莱彻校验和专门设计用于在软件中实现。

算法缺点

此校验和算法不能区分 0xFF0x00。这意味着所有位都设置为1的数据块将具有与所有位都设置为0的数据块完全相同的校验和。这源于该算法使用补码数学。

弗莱彻校验和在检测数据中的位错误方面并不像具有良好选择的CRC多项式那样出色。

如何使用

如果您有一个完整的数据块想要获取其校验和,可以使用calc函数(calc_fletcher16calc_fletcher32calc_fletcher64)在单个函数调用中获取校验和。

如果您是分块获取数据,可以创建一个Fletcher对象(Fletcher16Fletcher32Fletcher64)来管理数据块之间的中间状态。校验和对象接收数据块来处理。不需要指定数据块的长度,所有提供的数据都将被完全处理。输入数据类型由校验和值的长度决定,例如64位校验和操作32位宽的值。

可以使用[Fletcher:::value()]函数在任何时候查询校验和对象当前的校验和值。

示例

let data: [u8; 6] = [0xC1, 0x77, 0xE9, 0xC0, 0xAB, 0x1E];
assert_eq!(fletcher::calc_fletcher16(&data), 0x3FAD);
// Or if you want to work on smaller chunks of data
let mut checksum = fletcher::Fletcher16::new();
checksum.update(&data[0..3]);
checksum.update(&data[3..]);
assert_eq!(checksum.value(), 0x3FAD);

无运行时依赖