Неизвестный алгоритм проверки целостности данных поворота / добавления

#c #checksum #data-integrity

#c #контрольная сумма #целостность данных

Вопрос:

Я просматривал некоторый код, который загружает данные в память, и в конце загрузки он выполняет некоторую проверку целостности данных. Проверка целостности считывает буфер порциями по 4 байта и добавляет их в накопитель, поворачивая накопитель вправо 1 между каждым добавлением. Если накопитель заканчивается на 0, данные в порядке.

Я знаю, что последние байты буфера не являются частью самих данных, что означает, что последние 4 байта являются «магическим числом» для переключения накопителя на 0. Я также знаю, что он использует фрагменты по 4 байта, поскольку по умолчанию используется 32-битный процессор. Прилагается воссоздание кода:

 #define ROR32(i,c) ((i >> c)|(i << (32 - c)))
void check(uint32_t *buffer, uint32_t size) {
        uint32_t i, ret = 0;
        for (i=0; i < size/4 ; i  ) {
                ret = ROR32(ret, 1);
                ret  = buffer[i];
        }

        if (ret)
                printf("Data corrupt (%d)n", ret);
        else
                printf("Data OK.n");
}
  

Я хотел узнать, является ли это стандартным алгоритмом целостности (у него есть имя?) и почему вращение битов? Я не нашел ничего подобного, поскольку ключевые слова поиска «контрольная сумма», «целостность», «ror» и «сумма» являются неопределенными для каких-либо значимых результатов.

Спасибо.

Комментарии:

1. Кажется, изменен с en.wikipedia.org/wiki/BSD_checksum ?

2. Вращение битов необходимо , простое добавление не заметит замены двух 32-битных значений. Я не знаю, ваша ли это работа, но, как написано сейчас, он будет учитывать только каждый 4-й 32-битный блок…

3. Антти Хаапала, я думал о контрольной сумме BSD (она появилась в результатах), но, как вы заявили, она несколько изменена, и я пытаюсь понять, является ли это стандартом. Спасибо за подсказку о повороте битов, теперь это имеет большой смысл. Реализация — моя ошибка (я прочитал ее с пробелами по ошибке). Спасибо.