代码之家  ›  专栏  ›  技术社区  ›  Joseph Weissman

测试CRC逻辑的最佳方法?

  •  5
  • Joseph Weissman  · 技术社区  · 14 年前

    如何验证两个CRC实现将生成相同的校验和?

    我正在寻找一个详尽的实现评估方法,具体到CRC。

    5 回复  |  直到 10 年前
        1
  •  2
  •   Bernard    14 年前

    使用相同的输入创建多个单元测试,以比较两个实现的输出。

        2
  •  5
  •   Robert Christian    14 年前

    您可以将问题分为边缘案例和随机样本。

    边缘情况。CRC输入有两个变量,字节数和每个字节的值。因此,创建0、1和max_字节的数组,其值范围为0到max_字节_值。边缘案例套件将是您最可能希望保留在JUnit套件中的东西。

    随机样本。使用上面的范围,在循环中随机生成的字节数组上运行crc。你让循环运行的时间越长,你消耗的输入越多。如果您的计算能力不足,请考虑将测试部署到EC2。

        3
  •  2
  •   Kevin Thibedeau    10 年前

    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实现都会产生错误的结果,而这些结果恰好是通过恒定的等价性检查得到的。

        4
  •  1
  •   Adam Tegen    14 年前

    首先,如果它是一个标准的CRC实现,那么您应该能够在网络上的某个地方找到已知的值。

    其次,您可以生成一些有效负载,并在有效负载上运行每个CRC,并检查CRC值是否匹配。

        5
  •  0
  •   Darin Dimitrov    14 年前

    通过为每个接受相同输入并对照预期输出进行验证的对象编写单元测试。