1) Да, смотрите это в cassandra wiki,
Cassandra использует фильтры Блума для сохранения ввода-вывода при выполнении поиска ключа: каждый SSTable имеет связанный с ним фильтр Блума, который Cassandra проверяет перед выполнением поиска диска, делая запросы для ключей, которые не существуют, почти бесплатными
Столбцы ключа могут быть разбиты на несколько таблиц. Если бы не фильтры Блума, при каждом чтении ключа пришлось бы читать каждый sstable, что непомерно дорого. Используя фильтры Блума, Кассандре почти всегда приходится искать только в sstables, которые содержат данные для этого ключа.
2) Это может дать вам лучшее понимание фильтров Блума. Вы хешируете k раз, чтобы получить независимые позиции в массиве размером m. Например, если A и B являются элементами в наборе, и у вас есть k = 2, ваши хеш-функции - md5 и sha1, а m = 16, вы можете сделать
md5(A) % m = 7
sha1(A) % m = 12
md5(B) % m = 15
sha1(B) % m = 12
Это дает вам m [7], m [12] и m [15] для фильтра.
Чтобы увидеть, есть ли C в наборе, вы делаете
md5(C) % m = 8
sha1(C) % m = 12
Поскольку m [8] равно false, вы знаете, что C не входит в набор, однако для D
md5(D) % m = 7
sha1(D) % m = 15
И m [7], и m [15] имеют значение true, но D не входит в набор, поэтому D является ложноположительным.
Это стоит циклов ЦП, но вы торгуете циклами ЦП для уменьшенного ввода-вывода, что имеет смысл для Кассандры.
3) В статье не упоминается md5. md5 распределяется случайным образом, и я предполагаю, что разница между md5 и sha-1 для фильтров Блума невелика.