Самое интересное в фильтрах Блума заключается в том, что для эффективной работы им нужно несколько хеш-функций.
Строки Java уже имеют одну встроенную хэш-функцию, которую вы можете использовать — String.hashCode() with возвращает 32-битный целочисленный хэш. Это нормальный хэш-код для большинства целей, и, возможно, этого достаточно: например, если вы разделите его на 2 отдельных 16-битных хэш-кода, этого может быть достаточно для работы вашего фильтра Блума. Вы, вероятно, получите несколько коллизий, но это нормально — фильтры Блума должны иметь некоторые коллизии.
Если нет, вы, вероятно, захотите создать свой собственный, и в этом случае я бы рекомендовал использовать String.getChars() для доступа к необработанным данным char, а затем используйте это для вычисления нескольких хэш-кодов. .
Код Clojure для начала работы (просто суммируя значения символов):
(let [s "Hello"
n (count s)
cs (char-array n)]
(.getChars s 0 n cs 0)
(areduce cs i v 0 (+ v (int (aget cs i)))))
=> 500
Обратите внимание на использование взаимодействия Java в Clojure для вызова getChars и использование areduce для очень быстрой итерации по массиву символов.
Вас также может заинтересовать эта реализация фильтра Блума Java, которую я нашел на Github: https://github.com/MagnusS/Java-BloomFilter . Реализация хеш-кода на первый взгляд выглядит нормально, но она использует массив байтов, который, как мне кажется, немного менее эффективен, чем использование символов, из-за необходимости иметь дело с накладными расходами кодирования символов.
person
mikera
schedule
04.03.2012
hash()
в строке, например. cris.com/~Ttwang/tech/inthash.htm Сгенерированные значения может слишком сильно коррелировать, что может сделать фильтр Блума неэффективным. Подход, который я использовал в прошлом, заключается в использовании хеш-функции с очень длинным результатом, например SHA-256, и разбиении результата на куски. Это может быть слишком медленным для ваших целей. Самым простым может быть просто поиск в Google «строковой хэш-функции» и реализация нескольких результатов, которые она дает. - person pmdj   schedule 04.03.2012