Итак, самое интересное в фильтрах Блума состоит в том, что для эффективной работы им требуется несколько хеш-функций.
В Java Strings уже есть одна встроенная хеш-функция, которую вы можете использовать - String.hashCode () с возвращает 32-битное целое число.Это хороший хеш-код для большинства целей, и вполне возможно, что этого достаточно: если вы, например, разделите его на 2 отдельных 16-битных хеш-кода, этого может быть достаточно для работы вашего фильтра Блума.Вы, вероятно, получите несколько коллизий, но это нормально - ожидается, что фильтры Блума будут иметь некоторые коллизии.
Если нет, вы, вероятно, захотите свернуть свои собственные, в этом случае я бы рекомендовал использовать String.getChars () для доступа к необработанным символьным данным, а затем используйте его для вычисления нескольких хеш-кодов.
Код 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.На первый взгляд реализация хэш-кода выглядит нормально, но использует байтовый массив, который, я думаю, немного менее эффективен, чем использование символов, из-за необходимости иметь дело с накладными расходами кодировки символов.