Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
5分で分かるBloom Filter
Search
neo-nanikaka
July 22, 2014
Programming
1
4k
5分で分かるBloom Filter
neo-nanikaka
July 22, 2014
Tweet
Share
More Decks by neo-nanikaka
See All by neo-nanikaka
クリエイタープラットフォーム BOOTH、FANBOXでの 銀行口座支払いとペイアウトの事例 / PayPal Tech Meetup 11 pixiv
neo_nanikaka
0
2k
Other Decks in Programming
See All in Programming
GISエンジニアから見たLINKSデータ
nokonoko1203
0
190
ローカルLLMを⽤いてコード補完を⾏う VSCode拡張機能を作ってみた
nearme_tech
PRO
0
180
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
420
2年のAppleウォレットパス開発の振り返り
muno92
PRO
0
120
AIコーディングエージェント(Manus)
kondai24
0
220
生成AI時代を勝ち抜くエンジニア組織マネジメント
coconala_engineer
0
26k
「コードは上から下へ読むのが一番」と思った時に、思い出してほしい話
panda728
PRO
39
26k
クラウドに依存しないS3を使った開発術
simesaba80
0
180
Vibe codingでおすすめの言語と開発手法
uyuki234
0
130
Java 25, Nuevas características
czelabueno
0
120
Basic Architectures
denyspoltorak
0
130
tparseでgo testの出力を見やすくする
utgwkk
2
290
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
980
Paper Plane (Part 1)
katiecoart
PRO
0
2.1k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
91
Are puppies a ranking factor?
jonoalderson
0
2.4k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
36
Build your cross-platform service in a week with App Engine
jlugia
234
18k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
How STYLIGHT went responsive
nonsquared
100
6k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.3k
Transcript
5分でわかる Bloom Filter ※個人差があります
Bloom Filter 適用例
BOOTHアイコン BOOTHに商品が存在するタグ集合に 作品についたタグが含まれているかを判定 百科事典アイコン pixiv百科事典に記事が存在するタグ集合に 作品についたタグが含まれているかを判定 Bloom Filter 適用例
Burton H. Bloom (1970) 要素が集合の要素に含まれるかを判定する確率的アルゴリズム その他の要素判定アルゴリズム 探索木、ハッシュテーブル、線形リスト etc... Bloom Filter
準備 m ビットの配列 (初期値は0) 値が一様に分布する k 個のハッシュ関数 Bloom Filter 0
0 0 0 0 0 0 0 0 0 m = 10
要素 x を追加する O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す1箇所のビットに1を立てる hi % m ( 1 <= i <= k ) Bloom Filter 0 0 0 0 0 0 0 0 0 0 m = 10
要素 x を追加する O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す1箇所のビットに1を立てる hi % m ( 1 <= i <= k ) 例: 2 と 6 を追加する f(x) = 2 * x g(x) = 4 * x Bloom Filter 0 0 0 0 0 0 0 0 0 0 m = 10
要素 x を追加する O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す1箇所のビットに1を立てる hi % m ( 1 <= i <= k ) 例: 2 と 6 を追加する f(x) = 2 * x g(x) = 4 * x Bloom Filter 0 0 0 0 0 0 0 0 0 0 m = 10 2 6 f(x) % m g(x) % m
要素 x を追加する O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す1箇所のビットに1を立てる hi % m ( 1 <= i <= k ) 例: 2 と 6 を追加する f(x) = 2 * x g(x) = 4 * x Bloom Filter 0 0 0 0 0 0 0 0 0 0 m = 10 2 6 f(x) % m 4 g(x) % m 8
要素 x を追加する O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す1箇所のビットに1を立てる hi % m ( 1 <= i <= k ) 例: 2 と 6 を追加する f(x) = 2 * x g(x) = 4 * x Bloom Filter 0 0 0 1 0 0 0 1 0 0 m = 10 2 6 f(x) % m 4 g(x) % m 8
要素 x を追加する O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す1箇所のビットに1を立てる hi % m ( 1 <= i <= k ) 例: 2 と 6 を追加する f(x) = 2 * x g(x) = 4 * x Bloom Filter 0 0 0 1 0 0 0 1 0 0 m = 10 2 6 f(x) % m 4 2 g(x) % m 8 4
要素 x を追加する O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す1箇所のビットに1を立てる hi % m ( 1 <= i <= k ) 例: 2 と 6 を追加する f(x) = 2 * x g(x) = 4 * x Bloom Filter 0 1 0 1 0 0 0 1 0 0 m = 10 2 6 f(x) % m 4 2 g(x) % m 8 4 2回目だけど気にしたら負け ↑
要素 x の存在判定をする O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す全てのビットが1であれば true Bloom Filter 0 1 0 1 0 0 0 1 0 0 m = 10
要素 x の存在判定をする O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す全てのビットが1であれば true 例: 2 と 10 をチェックする f(x) = 2 * x g(x) = 4 * x Bloom Filter 0 1 0 1 0 0 0 1 0 0 m = 10
要素 x の存在判定をする O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す全てのビットが1であれば true 例: 2 と 10 をチェックする f(x) = 2 * x g(x) = 4 * x Bloom Filter 0 1 0 1 0 0 0 1 0 0 m = 10 2 10 f(x) % m 4 g(x) % m 8
要素 x の存在判定をする O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す全てのビットが1であれば true 例: 2 と 10 をチェックする f(x) = 2 * x g(x) = 4 * x Bloom Filter 0 1 0 1 0 0 0 1 0 0 m = 10 2 10 f(x) % m 4 g(x) % m 8 4番目と8番目のビットが1なので 2 は集合に存在する!!
要素 x の存在判定をする O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す全てのビットが1であれば true 例: 2 と 10 をチェックする f(x) = 2 * x g(x) = 4 * x Bloom Filter 0 1 0 1 0 0 0 1 0 0 m = 10 2 10 f(x) % m 4 2 g(x) % m 8 4
要素 x の存在判定をする O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す全てのビットが1であれば true 例: 2 と 10 をチェックする f(x) = 2 * x g(x) = 4 * x Bloom Filter 0 1 0 1 0 0 0 1 0 0 m = 10 2 10 f(x) % m 4 2 g(x) % m 8 4 2番目と4番目のビットが1なので 10 は集合に存在する!?
要素 x の存在判定をする O (k) x をk 個のハッシュ関数に渡して得られた値をh1, h2, …
, hk とする ハッシュ値の示す全てのビットが1であれば true 例: 2 と 10 をチェックする f(x) = 2 * x g(x) = 4 * x Bloom Filter 0 1 0 1 0 0 0 1 0 0 m = 10 2 10 f(x) % m 4 2 g(x) % m 8 4 10 は偽陽性の誤検出
特徴 必要メモリ量が集合要素数に比例しない 追加したい要素そのものを保持するわけではない 要素を追加しても使用メモリ量が増えない 追加・判定処理に必要な時間が集合要素数と無関係 要素の削除はできない => CountingFilter 要素を追加しすぎると誤検出の確率が上がる 偽陽性誤検出
偽陰性誤検出は絶対に起きない Bloom Filter
気になる誤検出確率: m : ビット数 n : 想定される登録要素の最大数 k: 誤検出確率を最小にする最適ハッシュ関数の数 (近似)
k ≒ 0.7 * m / n Bloom Filter
備考: BloomFilterの性能は明らかにハッシュ関数の性能に左右される 誤検出確率は一様に分布する優秀なハッシュ関数を想定している Bloom Filter
初期実装: 2,000,000ビットくらいの1本のブルームフィルタ でかすぎて(250KBくらい) apc_fetchに 6ms かかる →メッチャ重い →ブルームフィルタ要らない子 BOOTHアイコン適用裏話
リベンジ: 8192ビットのブルームフィルタを100本用意する →あるタグの存在判定に必要なのは1本だけ どのブルームフィルタを使えばいいのか? →タグ名をハッシュ化して求める 1本当たり1KBなのでapc_fetch問題もクリア (0.01ms) 誤検出確率は 0.1% →ブルームフィルタはやれば出来る子
BOOTHアイコン適用裏話