Hash CRC32引擎能否用于计算CRC16哈希?

Hash CRC32引擎能否用于计算CRC16哈希?,hash,crc,crc32,adler32,Hash,Crc,Crc32,Adler32,我正在与一个具有本机硬件函数的微控制器合作,从内存块计算CRC32哈希,在内存块中可以自由定义多项式。事实证明,系统有不同的数据链路,CRC的位长度不同,比如16位和8位,我打算使用硬件引擎 在使用的简单测试中,我得出结论,可以找到与8位CRC结果相同的32位多项式,例如: 使用8位引擎和多边形0xb7对“样本字符串”进行哈希运算,得到结果0x97 使用16位引擎和多边形0xb700对“样本字符串”进行哈希运算,得到结果0x9700 …32位引擎和多边形0xb7000000 yelds结果0x

我正在与一个具有本机硬件函数的微控制器合作,从内存块计算CRC32哈希,在内存块中可以自由定义多项式。事实证明,系统有不同的数据链路,CRC的位长度不同,比如16位和8位,我打算使用硬件引擎

在使用的简单测试中,我得出结论,可以找到与8位CRC结果相同的32位多项式,例如:

  • 使用8位引擎和多边形0xb7对“样本字符串”进行哈希运算,得到结果0x97
  • 使用16位引擎和多边形0xb700对“样本字符串”进行哈希运算,得到结果0x9700
  • …32位引擎和多边形0xb7000000 yelds结果0x97000000 (初始值为零,最终xor为零,无反射)
因此,用零填充多边形并右移结果似乎是可行的。 但是,是否“总是”可能找到一组参数,使32位引擎像16位或8位引擎一样工作?(包括多边形、最终xor、初始值和反转)


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

是的,您所做的工作通常适用于未反映的CRC。预处理和后处理可以非常简单地通过硬件指令循环周围的代码来完成


假设硬件CRC对此没有选项,要执行反射CRC,需要反射每个输入字节,然后反射最终结果。这可能会破坏使用硬件CRC的目的。(如果您的目的只是为了实现一个不同的实现,那么可能不会。)

来自@mark adler的问题回答让我无法确定我的初始结论。