Bloom filter

블룸 필터

Test several bits to distinguish definite absence from possible presence.

···
html
<div class="v"><header><b>BLOOM FILTER</b><span id="state"></span></header><main><div class="bits" id="bits"></div><div class="query" id="query"></div></main><footer>zero bit proves absence</footer></div>
css
.v{width:min(92vw,660px);height:min(86vh,310px);box-sizing:border-box;padding:clamp(9px,2.5vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);display:flex;flex-direction:column;gap:7px;color:var(--fg);font:500 clamp(15px,4.5vmin,19px)/1.25 var(--font-sans, sans-serif)}.v header,.v footer{display:flex;justify-content:space-between;align-items:center;gap:8px;white-space:nowrap}.v header b{color:var(--accent);font-size:.9em}.v header span,.v footer{color:var(--muted);font-size:.82em}.v main{flex:1;min-height:0;position:relative;overflow:hidden}.v .mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.v .active{background:var(--accent)!important;color:var(--bg)!important;border-color:var(--accent)!important}.v .muted{opacity:.45} .bits{height:57%;display:flex;align-items:center;justify-content:center;gap:3px}.bit{width:25px;height:30px;border:1px solid var(--line);border-radius:4px;display:grid;place-items:center;font:700 .8em ui-monospace,monospace}.query{text-align:center;color:var(--accent);font:600 .85em ui-monospace,monospace}
js
let n=0;const base=[1,0,1,1,0,1,0,1];function draw(){const checks=n%2?[1,4,6]:[0,3,7];document.getElementById("bits").innerHTML=base.map((v,i)=>"<div class=\"bit "+(checks.includes(i)?"active":"")+"\">"+v+"</div>").join("");document.getElementById("query").textContent=n%2?"B: bit 1 = 0 → absent":"A: all bits = 1 → maybe";document.getElementById("state").textContent=n%2?"definitely absent":"possibly present";n++}draw();setInterval(draw,1300)

A Bloom filter sets multiple bit positions for each inserted item. At lookup, any zero bit proves the item is absent.

All-one bits do not prove presence because other items may have set them. False positives become more likely as the filter fills, while ordinary insertion and lookup do not produce false negatives.

When to use

Use it to cheaply reject absent keys before querying a large store.

Open as page ↗