Ответ 1
Итак, забавная вещь о фильтрах цветения заключается в том, что для эффективной работы они нуждаются в нескольких хеш-функциях.
В строках Java уже есть одна хеш-функция, встроенная в которую вы можете использовать - String.hashCode() с возвратом 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
Обратите внимание на использование Clojure Java interop для вызова getChars, а использование isduce дает вам очень быструю итерацию по массиву символов.
Вас также может заинтересовать эта реализация фильтра цветения Java, которую я нашел в Github: https://github.com/MagnusS/Java-BloomFilter. Реализация hashcode выглядит с первого взгляда на первый взгляд, но использует байтовый массив, который, по моему мнению, немного менее эффективен, чем использование символов из-за необходимости иметь дело с накладными расходами символов.