Ответ 1
Hash Functions должен предоставить вам графическое доказательство того, почему FNV будет плохим выбором, и почему Murmur2 или один из Хэши Боба Дженкинса были бы хорошим выбором.
У меня возникает вопрос о выборе хеш-функций для фильтров Bloom:
В почти каждом документе/документе вы можете прочитать, что хеш-функции, используемые в цветном фильтре, должны быть независимыми и равномерно распределены.
Я знаю, что подразумевается под этим (независимым и равномерно распределенным), но мне трудно найти аргументацию или дискуссию, которые хеш-функции выполняют эти требования и поэтому подходят. Во многих сообщениях я читал о предложениях по использованию FNV или хеш-функции Murmur, но не почему (или, по крайней мере, без доказательства) они подходят.
Спасибо заранее!
Hash Functions должен предоставить вам графическое доказательство того, почему FNV будет плохим выбором, и почему Murmur2 или один из Хэши Боба Дженкинса были бы хорошим выбором.
Я задал себе тот же вопрос при создании библиотеки фильтров Java Bloom. См. Github readme для подробного рассмотрения моего анализа хеш-функций для фильтров Bloom.
Я рассмотрел проблему с двух сторон:
Скорость можно легко измерить с помощью тестов на случайном входе. Однородность немного сложнее и требует некоторой статистики. Используя критерий пригодности Chi-Square, я измерил, насколько аналогично распределение хэш-значений равно равномерному распределению.
Результат:
Если ваша реализация использует Java, я бы рекомендовал использовать нашу библиотеку хеша фильтра Bloom. Он хорошо документирован и тщательно протестирован. Для получения подробной информации, включая результаты тестов для разных хеш-функций и их несоответствие в соответствии с критерием Чи-Квадрата, см. Github readme of repo.
Я думаю, что разумным вариантом было бы несколько CRC-хэшей. Я предполагаю, что если вам нужны несколько n-бит хэш-значений, то для многочленов с булевыми коэффициентами поля существуют несколько простых многочленов степени n + 1. Но я не знаю процесса нахождения этих многочленов.
Другая возможность - использовать несколько модульных хэшей. Размер битового массива Bloom Filter должен быть максимальным значением по модулю. Но я думаю, что для того, чтобы он работал хорошо, значения модуля должны были бы быть продуктом простых чисел, превышающих 10, и относительно просто друг к другу. И диапазон от минимального до максимального значения модуля должен быть как можно меньше. Я не знаю, как найти такие ценности. Я написал код с открытым кодом С++ для быстрого вычисления остатков: https://github.com/wkaras/C-plus-plus-intrusive-container-templates/blob/master/modulus_hash.h