CRC32 引擎可以用于计算 CRC16 哈希值吗?
Can a CRC32 engine be used for computing CRC16 hashes?
我正在使用具有本机硬件功能的微控制器从内存块中计算 CRC32 哈希值,其中可以自由定义多项式。事实证明,系统有不同的数据链路,具有不同的 CRC 位长,例如 16 位和 8 位,我打算为此使用硬件引擎。
在 online tools 的简单测试中,我得出结论,可以找到与 8 位 CRC 具有相同结果的 32 位多项式,示例:
- 使用 8 位引擎和 poly 0xb7 散列 "a sample string" 产生结果 0x97
- 使用 16 位引擎和 poly 0xb700 散列 "a sample string" 产生结果 0x9700
- ...32 位引擎和 poly 0xb7000000 产生结果 0x97000000
(初始值为零,最终异或为零,无反射)
因此,用零填充多边形并将结果右移似乎可行。
但是 'always' 是否有可能找到一组使 32 位引擎像 16 位或 8 位引擎一样工作的参数? (包括 poly、final xor、init val 和反转)
为了提供更多上下文并防止 'bypass answers' 类似“不要使用本机引擎”:我在安全关键系统中有一个场景,需要防止常见的设计错误传播到冗余处理节点。一种解决方案是在一个节点中进行基于软件的 CRC 计算,并在其对中进行基于硬件的计算。
是的,您所做的通常适用于未反映的 CRC。使用围绕硬件指令循环的代码可以非常简单地完成预调节和 post 调节。
假设硬件 CRC 对此没有选项,要执行反射 CRC,您需要反映每个输入字节,然后反映最终结果。这可能会破坏使用硬件 CRC 的目的。 (尽管如果你的目的只是为了有一个不同的实现,那么也许不会。)
你不用猜。你可以计算一下。因为 CRC 是除以不可约多项式的余数,所以它在其域上是一对一的函数。
因此,例如,CRC16 必须产生 65536 (64k) 个唯一结果,如果您 运行 它超过 0 到 65536。
要查看您是否通过采用 CRC32 的部分得到相同的结果,运行 它超过 0 到 65535,保留您想要保留的 2 个字节,然后查看是否有任何冲突。
如果您的数据中有 32 位,那应该不是问题。如果您的数字少于 32 位,并且您在 32 位 space 中随机排列它们,就会出现问题。它们的第一个和最后一个字节不能保证均匀分布。
我正在使用具有本机硬件功能的微控制器从内存块中计算 CRC32 哈希值,其中可以自由定义多项式。事实证明,系统有不同的数据链路,具有不同的 CRC 位长,例如 16 位和 8 位,我打算为此使用硬件引擎。
在 online tools 的简单测试中,我得出结论,可以找到与 8 位 CRC 具有相同结果的 32 位多项式,示例:
- 使用 8 位引擎和 poly 0xb7 散列 "a sample string" 产生结果 0x97
- 使用 16 位引擎和 poly 0xb700 散列 "a sample string" 产生结果 0x9700
- ...32 位引擎和 poly 0xb7000000 产生结果 0x97000000 (初始值为零,最终异或为零,无反射)
因此,用零填充多边形并将结果右移似乎可行。 但是 'always' 是否有可能找到一组使 32 位引擎像 16 位或 8 位引擎一样工作的参数? (包括 poly、final xor、init val 和反转)
为了提供更多上下文并防止 'bypass answers' 类似“不要使用本机引擎”:我在安全关键系统中有一个场景,需要防止常见的设计错误传播到冗余处理节点。一种解决方案是在一个节点中进行基于软件的 CRC 计算,并在其对中进行基于硬件的计算。
是的,您所做的通常适用于未反映的 CRC。使用围绕硬件指令循环的代码可以非常简单地完成预调节和 post 调节。
假设硬件 CRC 对此没有选项,要执行反射 CRC,您需要反映每个输入字节,然后反映最终结果。这可能会破坏使用硬件 CRC 的目的。 (尽管如果你的目的只是为了有一个不同的实现,那么也许不会。)
你不用猜。你可以计算一下。因为 CRC 是除以不可约多项式的余数,所以它在其域上是一对一的函数。
因此,例如,CRC16 必须产生 65536 (64k) 个唯一结果,如果您 运行 它超过 0 到 65536。
要查看您是否通过采用 CRC32 的部分得到相同的结果,运行 它超过 0 到 65535,保留您想要保留的 2 个字节,然后查看是否有任何冲突。
如果您的数据中有 32 位,那应该不是问题。如果您的数字少于 32 位,并且您在 32 位 space 中随机排列它们,就会出现问题。它们的第一个和最后一个字节不能保证均匀分布。