如何验证两个CRC实现是否会生成相同的校验和?
我正在寻找一种详尽的实施评估CRC特有的方法。
答案 0 :(得分:6)
您可以将问题分为边缘案例和随机样本。
边缘情况。 CRC输入有两个变量,字节数和每个字节的值。因此,创建0,1和MAX_BYTES的数组,其值范围为0到MAX_BYTE_VALUE。边缘案例套件将是您最有可能想要保留在JUnit套件中的东西。
随机样本。使用上面的范围,在循环中随机生成的字节数组上运行CRC。让循环运行的时间越长,输入的耗尽就越多。如果您的计算能力较低,请考虑将测试部署到EC2。
答案 1 :(得分:2)
使用相同的输入创建多个单元测试,将两个实现的输出相互比较。
答案 2 :(得分:2)
CRC的一个不错的属性是,对于给定的一组参数(多项式,反射,初始状态等),当您在原始数据集+原始CRC上重新计算CRC时,将获得一个常量值。这些常量是针对常见的CRC记录的,但您可以使用两个不同的随机数据集盲目地生成它们并检查它们是否相同:
implementation 1: crc(rand_data_1 + crc(rand_data_1)) -> constant_1
implementation 2: crc(rand_data_2 + crc(rand_data_2)) -> constant_2
assert constant_1 == constant_2
您可以在实现中使用相同的方法来获得关于其正确性的温暖模糊感觉。如果您的实现使用任意多项式,您可以使用此方法对unittest进行详尽检查每个可能的多项式,而无需知道常量是什么。
这项技术功能强大,但添加一个独立的测试也是明智的,该测试根据病理情况的已知输入验证结果,在这种情况下,您的CRC实现都会产生通过恒定等价检查得到的错误结果。
答案 3 :(得分:1)
首先,如果它是标准的CRC实现,您应该能够在网络上的某个地方找到已知值。
其次,您可以生成一定数量的有效负载并在有效负载上运行每个CRC,并检查CRC值是否匹配。
答案 4 :(得分:0)
通过为每个采用相同输入的单元测试编写并验证预期输出。