Допустим, файл A имеет байты:
2
5
8
0
33
90
1
3
200
201
23
12
55
, и у меня есть простой алгоритм хеширования, в котором я храню сумму трех последних последовательных байтов так:
2
5
8 - = 8+5+2 = 15
0
33
90 - = 90+33+0 = 123
1
3
200 - = 204
201
23
12 - = 236
такЯ смогу представить файл A как 15, 123, 204, 236
. Допустим, я копирую этот файл на новый компьютер B, и я сделал несколько небольших изменений, и байты файла B:
255
2
5
8
0
33
90
1
3
200
201
23
12
255
255
"обратите внимание, что разница - это дополнительный байт в начале файла и 2 дополнительных байта в конце, но остальные очень похожи"
, поэтому я могу выполнить тот же алгоритм, чтобы определить, являются ли некоторые частифайл одинаков.Помните, что файл A был представлен хэш-кодами 15, 123, 204, 236
, давайте посмотрим, даст ли файл B некоторые из этих хэш-кодов!
, поэтому для файла BI придется делать это каждые 3 последовательных байта
int[] sums; // array where we will hold the sum of the last bytes
255 sums[0] = 255
2 sums[1] = 2+ sums[0] = 257
5 sums[2] = 5+ sums[1] = 262
8 sums[3] = 8+ sums[2] = 270 hash = sums[3]-sums[0] = 15 --> MATHES FILE A!
0 sums[4] = 0+ sums[3] = 270 hash = sums[4]-sums[1] = 13
33 sums[5] = 33+ sums[4] = 303 hash = sums[5]-sums[2] = 41
90 sums[6] = 90+ sums[5] = 393 hash = sums[6]-sums[3] = 123 --> MATHES FILE A!
1 sums[7] = 1+ sums[6] = 394 hash = sums[7]-sums[4] = 124
3 sums[8] = 3+ sums[7] = 397 hash = sums[8]-sums[5] = 94
200 sums[9] = 200+ sums[8] = 597 hash = sums[9]-sums[6] = 204 --> MATHES FILE A!
201 sums[10] = 201+ sums[9] = 798 hash = sums[10]-sums[7] = 404
23 sums[11] = 23+ sums[10] = 821 hash = sums[11]-sums[8] = 424
12 sums[12] = 12+ sums[11] = 833 hash = sums[12]-sums[9] = 236 --> MATHES FILE A!
55 sums[13] = 55+ sums[12] = 888 hash = sums[13]-sums[10] = 90
255 sums[14] = 255+ sums[13] = 1143 hash = sums[14]-sums[11] = 322
255 sums[15] = 255+ sums[14] = 1398 hash = sums[15]-sums[12] = 565
поэтому, глядя на эту таблицу, я знаю, что файл B содержит байты из файла A плюс дополнительные, потому что хэш-коды совпадают.
причина, по которой я показываю этот алгоритм, заключается в том, что он был порядка nДругими словами, я смог вычислить хэш последних 3 последовательных байтов без необходимости перебирать их!
Если у меня есть более сложный алгоритм, такой как выполнение md5 из последних 3 байтов, он будетбыть порядка n ^ 3, потому что, поскольку я перебираю файл BI, у меня должен быть внутренний цикл for, который будет вычислять хэш последних трех байтов.
Поэтому мой вопрос:
Как я могу улучшить алгоритм, сохраняя его порядка n.Это вычисляет хэш только один раз.Если я использую существующий алгоритм хеширования, такой как md5, мне придется поместить внутренний цикл внутри алгоритма, который значительно увеличит порядок алгоритма.
Обратите внимание, что то же самое можно сделать с умножением вместо сложения.но счетчик значительно растет очень быстро.Может быть, я могу комбинировать умножение, сложение и вычитание ...
Редактировать
Кроме того, если я гуглю для:
рекурсивные функции хеширования в граммах
появляется много информации, и я думаю, что эти алгоритмы очень трудно понять ...
Я должен реализовать этот алгоритм для проекта, поэтому я заново изобретаю колесо ... Я знаю, что есть многоалгоритмы там.
Также альтернативным решением, которое я думал, было выполнение того же алгоритма плюс еще один, который является сильным.поэтому файл AI будет выполнять один и тот же алгоритм каждые 3 байта плюс md5 из каждых 3 байтов.Во втором файле я просто выполню второй алгоритм, если первый сбудется ....