Лучший способ проверить логику CRC? - PullRequest
5 голосов
/ 30 августа 2010

Как проверить, что две реализации CRC будут генерировать одинаковые контрольные суммы?

Я ищу исчерпывающую методологию оценки реализации, специфичную для CRC.

Ответы [ 5 ]

6 голосов
/ 30 августа 2010

Вы можете разделить задачу на граничные случаи и случайные выборки.

Краевые чехлы. На входе CRC есть две переменные, число байтов и значение каждого байта. Поэтому создайте массивы 0, 1 и MAX_BYTES со значениями от 0 до MAX_BYTE_VALUE. В крайнем случае вам, скорее всего, захочется оставить пакет JUnit.

Случайные образцы. Используя приведенные выше диапазоны, запустите CRC для случайно сгенерированных массивов байтов в цикле. Чем дольше вы позволяете петле работать, тем больше вы истощаете входы. Если у вас мало вычислительной мощности, рассмотрите возможность развертывания теста на EC2.

2 голосов
/ 05 апреля 2014

Одним приятным свойством 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

Вы можете использовать один и тот же метод в реализации, чтобы получить теплыйнечеткое чувство о его правильности.Если ваша реализация работает с произвольными многочленами, вы можете сделать так, чтобы юнит-тест исчерпывающе проверял каждый возможный многочлен, используя этот метод, без необходимости знать, каковы константы.тест, который проверяет результат на основе известных входных данных для патологического случая, когда обе ваши реализации CRC дают неверные результаты, полученные при проверке на постоянную эквивалентность.

2 голосов
/ 30 августа 2010

Создайте несколько модульных тестов с одинаковыми входными данными, которые будут сравнивать выходные данные обеих реализаций друг с другом.

1 голос
/ 30 августа 2010

Во-первых, если это стандартная реализация CRC, вы сможете найти известные значения где-нибудь в сети.

Во-вторых, вы можете сгенерировать некоторое количество полезных нагрузок и запустить каждый CRC для полезных нагрузок и проверить, совпадают ли значения CRC.

0 голосов
/ 30 августа 2010

Путем написания модульного теста для каждого, который принимает один и тот же вход и проверяет ожидаемый результат.

...