какие есть варианты получения k попарно независимых хеш-функций, которые являются быстрыми

Я столкнулся с потребностью в k попарно независимых хеш-функциях, каждая из которых принимает в качестве входных данных целое число и выдает хэш-значение в диапазоне от 0 до N. Это нужно для скетча count-min, похожего на фильтр Блума.

Формально мне нужны хэш-функции h_1,h_2,...,h_k, попарно независимые.

(h_i(n) mod N ) даст хеш-значение n в диапазоне 0-N. Хеширование должно быть эффективным по времени, так как я работаю с большим набором данных. При этом они должны быть максимально попарно независимыми.

Что я пробовал до сих пор:

1) xxhash: это эффективно, но плохо с точки зрения попарной независимости, что означает наличие хэш-коллизий между хэш-функциями (это означает, что h1 (n1) = h1 (n2), тогда некоторые h_k (n1) также = h_k ( n2)) и из-за этого результат у меня был плохой.

2) Точно так же известный метод целочисленного хеширования ((a*n+b) mod p) mod N также имеет ту же проблему, что и xxhash. Я считаю, что это называется универсальным хешированием

3) Другой, введенный в count-min-sketch, дает неплохие результаты, но требует слишком много времени для большого ввода.

4) Также пробовал Murmur3, sha1 с аналогичными проблемами в коллизиях.

Любая идея будет принята с благодарностью. C/C++ предпочтительнее, но Java тоже подойдет или просто алгоритм. Спасибо


person Simo    schedule 09.12.2013    source источник
comment
Похоже, вы пытаетесь сделать фильтр Блума...   -  person Joe Z    schedule 09.12.2013
comment
Почти точно. Это скетч count-min, улучшенный алгоритм фильтра Блума.   -  person Simo    schedule 09.12.2013
comment
@simo какой у вас набор данных (это целые числа, строки и т. д.)   -  person Vikram Bhat    schedule 09.12.2013
comment
Вы уверены в целочисленном хешировании? пункт 5 раздела 2.3 документа people.csail.mit.edu/ronitt /COURSE/S12/handouts/lec5.pdf — это основанное на модульной арифметике доказательство того, что хэш-функции такого рода попарно независимы — или, возможно, вы имеете в виду что-то другое под этим термином?   -  person mcdowella    schedule 09.12.2013
comment
Если вам нужно, чтобы несколько функций, взятых вместе, были независимыми, попробуйте использовать разные простые числа - по китайской теореме об остатках объединенные результаты должны образовывать одну большую попарно независимую хеш-функцию.   -  person mcdowella    schedule 09.12.2013
comment
Если вы начнете с одной хеш-функции g(x) и определите H_i(x) = g(i|x), где i — конкатенация или что-то подобное, то столкновение между H_i() и H_j() будет выглядеть как столкновение между g(i| x) и g(j|x), так что одна хорошая хеш-функция может дать несколько хороших H_i(), но вы должны были видеть это с ax+b mod p, потому что использование разных пар (a,b) довольно близко к предварительному. обработка x для объединения его с i.   -  person mcdowella    schedule 09.12.2013
comment
@VikramBhat Набор данных содержит идентификаторы пользователей. Идентификаторы являются целыми числами. Количество пользователей может исчисляться миллионами. Так что нужен хороший и быстрый хэш для хеширования идентификаторов.   -  person Simo    schedule 09.12.2013
comment
@mcdowella Я имел в виду именно это. Это был первый, который я попробовал. Обычно это хороший хэш, но когда у вас большой набор данных, возникает много коллизий.   -  person Simo    schedule 09.12.2013
comment
Что вы называете h_k(n1) ? (относительно xxhash и по сравнению с h1(n1)) ? Вы имеете в виду тот же ввод, но с использованием другого семени?   -  person Cyan    schedule 10.12.2013


Ответы (1)


Я подозреваю, что ваша проблема с методом 2 заключается в том, что вы подбросили коррелированные a_i и b_i.
Работайте в большом поле (где-то около 2^64) и для начала убедитесь, что все a_i и b_i разные (т.е. вы получаете 2 *к разных чисел). Если бы они были равномерно распределены внутри поля, это тоже не помешало бы :)

Вы могли столкнуться с той же проблемой в методе 4 с SHA. Большинство криптографических хеш-функций (включая даже сломанные и старые) более чем достаточно для нужд структур данных, будь то k-wise независимость для любого разумного k или почти любое другое свойство.
Я бы перепроверил — как вы использовали Это?

person Yuriy    schedule 25.05.2014