我正在使用具有本机硬件功能的微控制器从内存块中计算 CRC32 哈希,其中多项式可以自由定义。事实证明,系统有不同的数据链路,具有不同的 CRC 位长度,如 16 位和 8 位,我打算为此使用硬件引擎。
在使用在线工具进行的简单测试中,我得出结论,可以找到与 8 位 CRC 具有相同结果的 32 位多项式,例如:
- 使用 8 位引擎和 poly 0xb7 对“样本字符串”进行散列运算得到结果 0x97
- 使用 16 位引擎和 poly 0xb700 散列“示例字符串”会产生结果 0x9700
- ...32 位引擎和 poly 0xb7000000 产生结果 0x97000000(初始值为零,最终异或为零,无反射)
因此,用零填充多边形并右移结果似乎有效。但是“总是”有可能找到一组参数使 32 位引擎像 16 位或 8 位引擎一样工作吗?(包括 poly、final xor、init val 和 inversions)
为了提供更多上下文并防止诸如“不要使用本机引擎”之类的“绕过答案”:我在安全关键系统中有一个场景,有必要防止常见的设计错误传播到冗余处理节点。一种解决方案是在一个节点中进行基于软件的 CRC 计算,并在其对中进行基于硬件的计算。