Понимание циклических полиномиальных хэш-столкновений

У меня есть код, который использует циклический полиномиальный скользящий хэш (Бужаш) для вычисления хэш-значений n-граммов исходного кода. Если я использую небольшие хэш-значения (7-8 бит), то есть разные n-граммы сопоставляются с одним и тем же хэш-значением. Если я увеличу биты в хэш-значении, чтобы сказать 31, тогда есть 0 коллизий - все ngrams сопоставляются с разными хэш-значениями.

Я хочу знать, почему это так? Зависят ли коллизии от количества n-граммов в тексте или числа разных символов, которые может иметь n-грамм или это размер n-грамма?

Как выбрать количество битов для хэш-значения при хэшировании n-граммов (используя скользящие хэши)?

2 ответов


как длина эффекты столкновений

это просто вопрос перестановок.

если я использую небольшой хэш-значения (7-8 бит), то есть некоторые столкновения

ну, давайте проанализируем это. С 8 битами есть 2^8 возможные двоичные последовательности, которые могут быть сгенерированы для любого заданного входа. Это 256 возможных хэш-значений, которые могут быть сгенерированы, что означает, что теоретически каждый 256 дайджест сообщения генерируемые значения гарантируют столкновение. Это называется проблемой дня рождения.

если я увеличу биты в хэш-значении, чтобы сказать 31, то есть 0 коллизий - все ngrams сопоставляются с различными хэш-значениями.

Хорошо, давайте применим ту же логику. С точностью 31 бит у нас есть 2^31 возможных комбинаций. Это 2147483648 возможных комбинаций. И мы можем обобщить это:

Let N denote the amount of bits we use.
Amount of different hash values we can generate (X) = 2^N

Assuming repetition of values is allowed (which it is in this case!)

это экспоненциальный рост, который почему с 8 битами вы нашли много столкновений, а с 31 битами вы нашли очень мало столкновений.

как это влияет на столкновения?

Ну, с очень небольшим количеством значений и равным шансом для каждого из этих значений, отображаемых на вход, у вас есть, что:

Let A denote the number of different values already generated.
Chance of a collision is: A / X 

Where X is the possible number of outputs the hashing algorithm can generate.

, когда X равна 256, у вас есть 1/256 вероятность столкновения, в первый раз. Тогда у вас есть 2/256 шанс столкновения когда генерируется другое значение. До тех пор, пока вы не сгенерировали 255 различных значений, и у вас есть 255/256 вероятность столкновения. В следующий раз, очевидно, это становится 256/256 или 1, что является вероятностной уверенностью. Очевидно, обычно до этого не доходит. Столкновение, скорее всего, произойдет намного больше, чем каждый 256 циклы. На самом деле, парадокс дня рождения говорит нам, что мы можем начать ожидать столкновения после 2^N/2 хэш-значения сгенерированный. Итак, следуя нашему примеру, это после того, как мы создали 16 уникальные хэши. Мы знаем, однако, что это должно произойти, как минимум, каждый 256 циклы. Что нехорошо!

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

A примечание по алгоритмам хэширования

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


Если у вас есть хэш-значений 8 бит, общее количество значений 256 - это означает, что если хэш-257 различных N-грамм будет точно, по крайней мере одно столкновение (...и очень вероятно, что вы получите гораздо больше столкновений, даже с менее чем 257 n-граммами) - и это произойдет независимо от алгоритма хэширования или хэширования данных.

Если вы используете 32 бит общее возможное количество значений составляет около 4 миллиардов - и поэтому вероятность столкновения значительно меньше.

'Как выбрать количество бит': я думаю, зависит от использования хэша. Если он используется для хранения n-граммов в какой - то хэшированной структуре данных (словаре), то он должен быть связан с возможным количеством "ведер" структуры данных-например, если словарь имеет менее 256 ведер, что 8-битный хэш в порядке.

посмотреть этой на каком-то фоне