4个版本 (稳定)
1.1.0 | 2020年4月16日 |
---|---|
1.0.1 | 2019年8月9日 |
0.1.0 | 2019年8月9日 |
#657 in 网络编程
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]
,其中I
是code_size
大小的单位矩阵,0
是一个适当大小的零列向量,而P
是一个全零向量,最后一个位设置为data * H
的奇偶校验。
在编码过程中,data
的最后code_size
位被替换为r
。
在解码过程中,如果检测到错误(非空,已知校验子),它会原地纠正,并将最后code_size
位重置为0
以避免误解释,并允许在修改数据后立即重新编码。
许可
此源代码形式受Mozilla公共许可证第2.0版条款约束。如果此文件未附带MPL副本,您可以从https://mozilla.org/MPL/2.0/获取。
依赖项
~130KB