CRC32引擎可以用于计算CRC16哈希吗?

时间:2017-04-12 21:09:38

标签: hash crc crc32 adler32

我正在使用具有本机HW功能的微控制器来计算来自内存块的CRC32哈希值,其中多项式可以自由定义。事实证明,系统具有不同的CRC数据链路,如16位和8位,我打算使用硬件引擎。

online tools的简单测试中,我得出结论,有可能找到一个与8位CRC具有相同结果的32位多项式,例如:

  • 使用8位引擎散列“示例字符串”,并且poly 0xb7 yelds结果为0x97
  • 散列“带有16位引擎的样本字符串”和poly 0xb700 yelds结果为0x9700
  • ... 32位引擎和poly 0xb7000000的结果为0x97000000 (零初始值和零最终xor,无反射)

因此,用零填充多边形并右移结果似乎有效。 但是,总是可以找到一组使32位引擎能够用作16位或8位引脚的参数吗? (包括poly,final xor,init val和inversions)

提供更多上下文并防止“绕过答案”,例如“不要使用本机引擎”:我在安全关键系统中有一个场景,必须防止常见的设计错误传播到冗余处理节点。其中一个解决方案是在一个节点中进行基于软件的CRC计算,在其中使用基于硬件的计算。

1 个答案:

答案 0 :(得分:2)

是的,您正在做的事情通常适用于未反映的CRC。使用硬件指令循环周围的代码可以非常简单地完成前置和后置调节。

假设硬件CRC没有这个选项,要做反射CRC,你需要反映每个输入字节,然后反映最终结果。这可能会破坏使用硬件CRC的目的。 (虽然如果你的目的只是为了实现不同的实现,那么也许它不会。)