我不得不在我正在处理的系统上替换 CRC32 实现,之前实现的算法使用大小为 256 的查找表,并且太大而无法在引导加载程序中使用。我实现的新算法使用大小为 16 的查找表。
我使用与以前相同的多项式,但结果不同。在线计算器会抛出更多随机结果,其中大多数都不是很清楚他们在做什么,即他们正在使用哪个多项式,输入数据是什么格式或初始 crc 值是什么。
有谁知道我在哪里可以找到用于 CRC32 实现的可靠、标准化的测试向量?
谢谢!
我不得不在我正在处理的系统上替换 CRC32 实现,之前实现的算法使用大小为 256 的查找表,并且太大而无法在引导加载程序中使用。我实现的新算法使用大小为 16 的查找表。
我使用与以前相同的多项式,但结果不同。在线计算器会抛出更多随机结果,其中大多数都不是很清楚他们在做什么,即他们正在使用哪个多项式,输入数据是什么格式或初始 crc 值是什么。
有谁知道我在哪里可以找到用于 CRC32 实现的可靠、标准化的测试向量?
谢谢!
是的,这个 CRC 目录。每个 CRC 定义都包含一个 check
值——这是 CRC 对 ASCII / UTF-8 输入的 9 字节字符串“123456789”的输出。例如,CRC-32("123456789", 9) = 0xcbf43926。
为什么不简单地将新实现与旧实现进行比较?
没有任何形式的标准化,只是为了方便而收集的:
// Trivial one.
UINT32_C(0x00000000), ""
// Source: https://rosettacode.org/wiki/CRC-32
UINT32_C(0x414FA339), "The quick brown fox jumps over the lazy dog"
// Source: http://cryptomanager.com/tv.html
UINT32_C(0x9BD366AE), "various CRC algorithms input data"
// Source: http://www.febooti.com/products/filetweak/members/hash-and-crc/test-vectors/
UINT32_C(0x0C877F61), "Test vector from febooti.com"
如果您的结果不匹配怎么办?一定要检查你正在实现和比较哪种类型的CRC,这样的挖掘的一个很好的例子可以在“<a href="https://blog.box.com/blog/crc32-checksums-the- good-the-bad-and-the-ugly/" rel="nofollow">CRC32 校验和;The Good, The Bad, And The Ugly”一文,其中表明某些程序可能会在其他相同的操作之后进行额外的处理,例如通过校验和传输消息的长度,文档中可能包含也 可能不包含。
Ironclad 存储库有一些可能有用的测试向量:
;;; standard tests for crc32
(:digest-test #a"" #h"00000000")
(:digest-test #a"a" #h"e8b7be43")
(:digest-test #a"abc" #h"352441c2")
(:digest-test #a"message digest" #h"20159d7f")
(:digest-test #a"abcdefghijklmnopqrstuvwxyz" #h"4c2750bd")
(:digest-test #a"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" #h"1fc2e6d2")
(:digest-test #a"12345678901234567890123456789012345678901234567890123456789012345678901234567890" #h"7ca94a72")
https://github.com/froydnj/ironclad/blob/master/testing/test-vectors/crc32.testvec
zlib-ng 中也有一些测试:
https://github.com/zlib-ng/zlib-ng/blob/develop/test/crc32_test.c