#纠错 #汉明码 #网络 #确定性 #检测 # #

secded

面向所有人的单错纠正、双错检测码

4个版本 (稳定)

1.1.0 2020年4月16日
1.0.1 2019年8月9日
0.1.0 2019年8月9日

#657 in 网络编程

MPL-2.0许可证

69KB
2K SLoC

面向所有人的单错纠正、双错检测

此包提供Secded特质,允许将基于汉明码+奇偶校验的SECDED纠正码添加到任何有效载荷。

编码和解码始终在"原地"进行:编码时传递的缓冲区的最后几个比特应该是0。不遵守此约束将导致panic。您可以使用"no_panic"功能禁用检查,但违反此约束将导致编码错误。

实现

此包提供的实现按从快到慢的顺序列出。

SecDed64

这是此包提供的最快实现,除非您需要编码超过57位的有效载荷,否则我推荐使用此实现。

SecDed128

在x86_64机器上几乎与SecDed64一样快(性能略有下降是由于编码/解码矩阵使用2个缓存行而不是1个),我尚未在其他架构上测试它。由于在编写时,某些架构(如emscripten)对u128的支持仍不确定,因此在处理更复杂的平台时请小心。

如果您需要编码58至120位的有效载荷,并且您的平台对u128有良好的支持,则应使用此实现。

SecDedDynamic

它可以处理任何大小的编码,但比其他两个实现慢得多(当处理相同的编码大小时,大约慢10倍)。它还需要libstd才能运行。
它位于"dyn"功能标志后面,默认情况下是关闭的。除非您激活此功能,否则此包可以在#![no_std]环境中编译。

FFI

secded.h 中,您可以找到此crate的FFI头文件。请注意,只有在请求了"ffi"功能时,才会构建FFI,而提供的CMakeList.txt文件会自动进行此操作。

提供的CMakeList.txt文件还展示了如何提供选项以启用底层crate的功能。

基准测试

这些基准测试仅作参考,但您可以使用以下命令自行运行:cargo +nightly bench --features "dyn bench" secded

test secded_128::decode          ... bench:          23 ns/iter (+/- 1)
test secded_128::decode_1err     ... bench:          50 ns/iter (+/- 2)
test secded_128::encode          ... bench:          27 ns/iter (+/- 5)
test secded_64::decode           ... bench:          15 ns/iter (+/- 0)
test secded_64::decode_1err      ... bench:          41 ns/iter (+/- 4)
test secded_64::encode           ... bench:          17 ns/iter (+/- 1)
test secded_dynamic::decode      ... bench:         397 ns/iter (+/- 26)
test secded_dynamic::decode_1err ... bench:         502 ns/iter (+/- 30)
test secded_dynamic::encode      ... bench:         411 ns/iter (+/- 27)

内存分配

在示例上运行Valgrind应该在USE_DYN功能标志关闭的情况下报告0泄漏。
当使用USE_DYN功能标志时,您应该看到仍有8字节是可访问的:这是正常的,因为这是由于使用lazy_static向实现提供常量的原因。

未能调用SECDED_DYN_free(...)(而不是free)在由SECDED_DYN_new(...)提供的指针上,将导致大内存泄漏,即使编码大小只有57字节,间接损失也将达到9608字节,加上由SecDedDynamic结构本身占用的160字节。间接损失似乎与请求的编码大小呈线性关系。
因此,如果您的语言支持自定义析构函数,我强烈建议将提供的指针包装在一个具有析构函数的引用计数器中,该析构函数将调用SECDED_DYN_free(...)

工作原理

校正矩阵C是通过连接每个可编码整数的列向量表示(最高有效位在最上面)以及一个大于一个的位计数来构建的。这种构建C的方法是确定的,并保证了跨实现的兼容性。

通常,编码会使用encoded = data * G,其中data是一个N位的列向量,而G是位于C之上的N大小的单位矩阵。

相反,此实现依赖于数据是N位后跟code_size位设置为0,这样就可以使用相同的计算r = data * H + P来计算编码时的校正码和解码时的校验码。H随后是[C I 0],其中Icode_size大小的单位矩阵,0是一个适当大小的零列向量,而P是一个全零向量,最后一个位设置为data * H的奇偶校验。

在编码过程中,data的最后code_size位被替换为r
在解码过程中,如果检测到错误(非空,已知校验子),它会原地纠正,并将最后code_size位重置为0以避免误解释,并允许在修改数据后立即重新编码。

许可

此源代码形式受Mozilla公共许可证第2.0版条款约束。如果此文件未附带MPL副本,您可以从https://mozilla.org/MPL/2.0/获取。

依赖项

~130KB