распараллеливаемая хеш-функция для проверки целостности данных - PullRequest
1 голос
/ 06 марта 2012

Мне нужно проверить целостность данных в следующей ситуации: данные записываются в хранилище кусками разного размера (для каждого блока мы знаем его смещение в конечном файле).Тем не менее, куски приходят в произвольном порядке и в нескольких потоках.Они считываются из хранилища в совершенно ином порядке (и куски имеют разный размер).

В настоящее время я имею в виду следующее:

    #define MODEST_PRIME 1021
    unsigned char checkbuf[MODEST_PRIME];
    void check_function(unsigned char *chunk, size_t offset, size_t length, unsigned char *result)
    {
       size_t i;
       for(i=0; i<length; i++)
           result[(i+offset)%MODEST_PRIME]^=chunk[i];
    }

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

Однако эта функция выглядит весьма несложной по сравнению с суммой md5 или любой другой современной хеш-функцией.Но, насколько я понимаю, вычисление суммы md5 или sha-1 не может быть выполнено в произвольном порядке.

Ну, вопрос в том, есть ли у нас лучшее решение, которое

  1. может быть вычислено в произвольном порядке, если мы знаем размер и смещение кусков (как простой алгоритмЯ обрисовал в общих чертах выше).
  2. Может предложить проверку целостности данных, по крайней мере, сравнимую с проверкой суммы md5.

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

Один из вариантов - древовидная иерархия проверки контрольных сумм.

С двумя уровнями вы поместите куски на 1-й (нижний) уровень дерева.2-й уровень дерева - это байтовый массив, созданный путем объединения контрольных сумм с нижнего уровня.

Это работает с любой хэш-функцией.

0 голосов
/ 06 марта 2012

Не могли бы вы просто вычислить сумму SHA1 каскадного смещения, длины и содержимого каждого куска, а затем затем скомпоновать их вместе?

...