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 算法
1,762 每月下载量
用于 cxl_rs
17KB
322 行
fletcher
弗莱彻校验和算法的无依赖实现
弗莱彻校验和是为了提供与CRC类似的错误检查能力,但具有更快的软件实现。这不是一个加密安全的校验和,它仅用于检查数据的完整性,而不是真实性。
算法优点
此算法在软件中运行的比大多数CRC算法都要快。这是因为CRC算法最初是为了便于在硬件中实现而设计的,但并不一定适合在软件中实现。弗莱彻校验和专门设计用于在软件中实现。
算法缺点
此校验和算法不能区分 0xFF
和 0x00
。这意味着所有位都设置为1的数据块将具有与所有位都设置为0的数据块完全相同的校验和。这源于该算法使用补码数学。
弗莱彻校验和在检测数据中的位错误方面并不像具有良好选择的CRC多项式那样出色。
如何使用
如果您有一个完整的数据块想要获取其校验和,可以使用calc函数(calc_fletcher16
、calc_fletcher32
、calc_fletcher64
)在单个函数调用中获取校验和。
如果您是分块获取数据,可以创建一个Fletcher
对象(Fletcher16
、Fletcher32
、Fletcher64
)来管理数据块之间的中间状态。校验和对象接收数据块来处理。不需要指定数据块的长度,所有提供的数据都将被完全处理。输入数据类型由校验和值的长度决定,例如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);