Pular para o conteúdo

Arquitetura de software · Escala e desempenho · 5 min de leitura

Bloom filters: “com certeza não está” em poucos bytes

Uma estrutura probabilística que responde se um item talvez esteja num conjunto — sem falsos negativos — usando uma fração da memória.

Item “ana” → hash 1Item “ana” → hash 2Item “ana” → hash 3hash 1 → Vetor de bits: liga bitliga bithash 2 → Vetor de bitshash 3 → Vetor de bitsItem “ana”Item “ana”hash 1 — posição 3hash 1posição 3hash 2 — posição 7hash 2posição 7hash 3 — posição 12hash 3posição 12Vetor de bits — 0 0 0 1 0 0 0 1 … 1Vetor de bits0 0 0 1 0 0 0 1 … 1

Arraste para o lado para ver o diagrama inteiro.

Na consulta, se algum dos k bits estiver zerado, o item com certeza nunca foi inserido.

Como funciona

Um vetor de m bits começa zerado. Para inserir, calculam-se k hashes do item e ligam-se essas k posições. Para consultar, verificam-se as mesmas posições: se alguma é 0, o item não está; se todas são 1, o item provavelmente está (outros itens podem ter ligado os mesmos bits). Com cerca de 10 bits por item, a taxa de falso positivo fica perto de 1%.

Onde aparece

  • Bancos (LSM-trees, Bigtable, Cassandra): evitam ler arquivos do disco que certamente não contêm a chave.
  • Caches e CDNs: não guardar itens vistos uma única vez.
  • Verificações rápidas: nome de usuário já usado, URL maliciosa conhecida, artigo já recomendado.

Limites

Não dá para listar os itens nem remover (a variante counting permite remoção com mais memória). O tamanho precisa ser planejado para o número esperado de itens; passando disso, os falsos positivos crescem. Sempre confirme o “talvez” na fonte da verdade quando o erro importar.

Em resumo

Referências

Continue aprendendo

Todos os temas de arquitetura de software →