Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
5分で分かるBloom Filter
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
Grafana:建立系統全知視角的捷徑
blueswen
0
330
OCaml 5でモダンな並列プログラミングを Enjoyしよう!
haochenx
0
140
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
610
CSC307 Lecture 07
javiergs
PRO
1
560
Apache Iceberg V3 and migration to V3
tomtanaka
0
170
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
7
3.9k
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
2.5k
CSC307 Lecture 02
javiergs
PRO
1
780
MUSUBIXとは
nahisaho
0
140
Fluid Templating in TYPO3 14
s2b
0
130
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
170
生成AIを活用したソフトウェア開発ライフサイクル変革の現在値
hiroyukimori
PRO
0
100
Featured
See All Featured
Code Review Best Practice
trishagee
74
20k
What does AI have to do with Human Rights?
axbom
PRO
0
2k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.1k
Everyday Curiosity
cassininazir
0
130
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Rails Girls Zürich Keynote
gr2m
96
14k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.2k
Accessibility Awareness
sabderemane
0
56
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
200
Code Reviewing Like a Champion
maltzj
527
40k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
430
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アイコン適用裏話