У меня следующий вопрос в контексте BloomFilter. BloomFilters должны иметь k
независимых хеш-функций. Назовем эту функцию h1, h2, ... hk
. Независимость в этом контексте означает, что их значение будет иметь очень небольшую корреляцию (надеюсь, нулевую) при применении к одному и тому же набору. См. описание алгоритма на странице http://en.wikipedia.org/wiki/Bloom_filter (но не конечно, вы уже знаете эту страницу наизнанку :).
Теперь предположим, что я хочу определить свои хэш-функции, используя некоторые n
бита (исходя из криптографической функции, если вам нужно знать, но это не имеет отношения к вопросу), которые сами по себе независимы друг от друга. Если вам нужен дополнительный контекст, вы можете прочитать http://bitworking.org/news/380/bloom-filter-resources, который делает что-то подобное.
Например, предположим, что я хочу определить каждый h
как (извините за мой псевдокод):
bytes = MD5(value)
h1 = bytes[0-3] as Integer
h2 = bytes[4-7] as Integer
h3 = bytes[8-11] as Integer
...
Конечно, у нас очень быстро закончатся хеш-функции. В этом примере MD5 мы получаем только четыре.
Одна из возможностей состоит в том, чтобы позволить хеш-функциям перекрываться друг с другом и не требовать, чтобы четыре байта были последовательными. Таким образом, у нас есть много хеш-функций, поскольку массив байтов допускает перестановки. Для простоты, что, если мы определим хэш-функции следующим образом:
bytes = MD5(value)
h1 = bytes[0-3] as Integer
h2 = bytes[1-4] as Integer
h3 = bytes[2-5] as Integer
...
Легко заметить, что в случае MD5 теперь у нас 12 функций хэширования вместо четырех.
Наконец, мы подошли к вопросу THE. Являются ли эти хеш-функции независимыми? Спасибо!
ОБНОВЛЕНИЕ: я решил попытаться ответить на вопрос с практической точки зрения, поэтому я создал небольшую программу, которая будет проверять гипотезу. Смотри ниже.