Почему по модулю 65521 в алгоритме контрольной суммы Adler-32?

Алгоритм контрольной суммы Adler-32 суммирует по модулю 65521. Я знаю, что 65521 - это самое большое простое число, которое соответствует 16 бит, но почему важно использовать простое число в этом алгоритме?

(Я уверен, что ответ будет казаться очевидным, как только кто-то мне скажет, но части теории моего мозга просто не работают. Даже без экспертизы в алгоритмах контрольной суммы умный человек, который читает http://en.wikipedia.org/wiki/Fletcher%27s_checksum, возможно, объяснит это мне.)

Ответы

Ответ 1

Почему для Adler32 использовался mod prime?

С собственного сайта Adler http://zlib.net/zlib_tech.html

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

Основная причина для Адлера-32 - Конечно, скорость в программном обеспечении реализации.

Альтернативой Adler-32 является Fletcher-32, который заменяет модулем 65521 на 65535. Этот документ показывает, что Fletcher-32 превосходит каналы с низкоскоростными случайными битовыми ошибками.

Он использовался, потому что простые пробы имеют лучшие свойства смешивания. Точно, насколько хорошо это еще предстоит обсудить.

Другие пояснения

Кто-то еще в этом потоке делает несколько убедительный аргумент в пользу того, что модуль prime лучше для обнаружения бит-подкачки. Однако это скорее всего не в случае, потому что бит-обмен крайне редок. Двумя наиболее распространенными ошибками являются:

  • Случайные бит-флипы (1 ↔ 0), встречающиеся в любом месте.
  • Бит-сдвиг (1 2 3 4 5 → 2 3 4 5 или 1 1 2 3 4 5) общий в сети

Большая часть бит-обмена происходит из-за случайных бит-флип, которые выглядели как бит-обмен.

Коды исправления ошибок на самом деле предназначены для противостояния n-битам отклонения. С сайта Адлера:

Правильно построенный CRC-n имеет nice, которое меньше, чем n бит в ошибка всегда обнаруживается. Это не всегда верно для Adler-32 - он может обнаруживать все одно- или двухбайтовые ошибки, но может пропустить некоторые трехбайтовые ошибки.

Эффективность использования простого модуля

Я сделал длинную запись по одному и тому же вопросу. Почему по модулю простое число?

http://www.codexon.com/posts/hash-functions-the-modulo-prime-myth

Короткий ответ

Мы знаем гораздо меньше о простых числах, чем составные. Поэтому такие люди, как Кнут, начали их использовать.

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

Вот график столкновений на один ковш с 10 миллионами криптографически случайных целых чисел, сравнивающий модем 65521 и 65535.

Ответ 2

Алгоритм Adler-32 состоит в вычислении

A = 1 + b1 + b2 + b3 + ...

и

B = (1 + b1) + (1 + b1 + b2) + (1 + b1 + b2 + b3) + ... = 1 + b1 + 2 * b2 + 3 * b3 + ...

и сообщать об этом по модулю m. Когда m является простым, числа по модулю m образуют то, что математики называют полем. Поля имеют удобное свойство, что для любого ненулевого c мы имеем a = b тогда и только тогда, когда c * a = c * b. Сравните таблицу times modulo 6, которая не является простым, с таблицей разностей по модулю 5, которая:

* 0 1 2 3 4 5
0 0 0 0 0 0 0
1 0 1 2 3 4 5
2 0 2 4 0 2 4
3 0 3 0 3 0 3
4 0 4 2 0 4 2
5 0 5 4 3 2 1

* 0 1 2 3 4
0 0 0 0 0 0
1 0 1 2 3 4
2 0 2 4 1 3
3 0 3 1 4 2
4 0 4 3 2 1

Теперь часть A обманывается всякий раз, когда мы обмениваем два байта - добавление все-таки коммутативно. Предполагается, что часть B обнаруживает такую ​​ошибку, но когда m не является простым, большее количество мест уязвимо. Рассмотрим контрольную сумму Adler mod 6 из

1 3 2 0 0 4

Мы имеем A = 4 и B = 1. Теперь рассмотрим замену b2 и b4:

1 0 2 3 0 4

A и B не изменяются, потому что 2 * 3 = 4 * 0 = 2 * 0 = 4 * 3 (по модулю 6). Можно также заменить 2 и 5 на тот же эффект. Это более вероятно, когда таблица разностей не сбалансирована - по модулю 5, эти изменения обнаружены. Фактически, единственный раз, когда первичный модуль не может обнаружить один обмен, когда два одинаковых индекса mod m меняются местами (и если m велико, они должны быть далеко друг от друга!). Эта логика также может применяться к взаимозаменяемым подстрокам.

Недостаток использования меньшего модуля заключается в том, что он будет терпеть неудачу несколько чаще на случайных данных; в реальном мире, однако, коррупция редко бывает случайной.

^ Доказательство. Предположим, что мы меняем индексы я и j со значениями a и b. Тогда ai + bj = aj + bi, поэтому ai - aj + bj - bi = 0 и (a - b) * (i - j) = 0. Так как поле является областью целостности, то a = b (значения конгруэнтны) или я = j (индексы конгруэнтны).

РЕДАКТИРОВАТЬ: веб-сайт, связанный с неизвестным (http://www.zlib.net/zlib_tech.html), ясно показывает, что дизайн Adler-32 был вовсе не принципиален. Из-за кода Хаффмана в потоке DEFLATE даже небольшие ошибки, вероятно, изменят кадрирование (потому что они зависят от данных) и вызывают большие ошибки в выходе. Рассмотрим этот ответ на немного надуманном примере того, почему люди приписывают некоторые свойства простым числам.

Ответ 3

Короче говоря:

По модулю prime имеет лучшие свойства перетаскивания бит, и это именно то, что мы хотим для хэш-значения.

Ответ 4

Для совершенно случайных данных, чем больше ведер, тем лучше.

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

Если число по модулю не является простым, то любой шаблон, влияющий на одно из чисел, составляющих модуль, может влиять на хеш. Поэтому, если вы используете 15, шаблон каждые 3 или 5, а также каждые 15 может вызвать столкновение, а если вы используете 13, шаблон должен будет составлять каждые 13, чтобы вызвать столкновения.

65535 = 3 * 5 * 17 * 257, поэтому шаблон, включающий 3 или 5, может вызвать столкновения с использованием этого модуля: если по какой-то причине, например, кратные 3 были гораздо более распространены, то тогда только ковши, которые были кратными из 3 будет полезно.

Теперь я не уверен, реалистично ли это, вероятно, будет проблемой. Было бы неплохо определить скорость столкновения эмпирически с фактическими данными того типа, который нужен хешу, а не случайными числами. (Например, будут ли численные данные с участием http://en.wikipedia.org/wiki/Benford's_law" > закона Бэнфорда или некоторые такие нарушения, которые могут повлиять на этот алгоритм? Как насчет использования кодов ASCII для реалистичного текста?)

Ответ 5

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

Если единственные причины, по которым сравниваемые вещи не совпадают, были бы случайным повреждением одного из них, то использование простого модуля для контрольной суммы Adler-32, вероятно, не особенно полезно. Если, однако, возможно, что одна из вещей могла иметь некоторые "преднамеренные" изменения, внесенные в нее, использование модуля без перфораций может привести к тому, что некоторые изменения останутся незамеченными. Например, эффекты изменения байта от 00 до FF и изменение другого байта, что несколько кратных 257 байт раньше или позже от FF до 00, будут отменяться при использовании контрольной суммы Fletcher, но не при использовании контрольной суммы Adler-32. Не особенно вероятно, что такой сценарий возникнет из-за случайного повреждения, но такие изменения могут произойти при изменении программы. Не было бы особенно вероятно, что они будут встречаться с точным числом в 257 байт, но это риск, которого можно избежать с помощью простого модуля (при условии, что, по крайней мере, количество байтов в файле меньше модуль)

Ответ 6

Ответ лежит в теории поля. Множество Z/Z_n с операциями плюс und times является полем, когда n является простым (т.е. Сложение и умножение с модулем n).

Другими словами, следующее уравнение:

m * x = (in Z/Z_n) 

имеет только одно решение для любого значения m (а именно, x = 0)

Рассмотрим следующий пример:

2 * x = 0 (mod 10)

Это уравнение имеет два решения: x = 0 AND x = 5. Это потому, что 10 не является простым и может быть записано как 2 * 5.

Это свойство отвечает за лучшее распределение хэш-значений.