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
neo-nanikaka
July 22, 2014
Programming
4.1k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
5分で分かるBloom Filter
neo-nanikaka
July 22, 2014
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
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
370
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
190
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
230
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
270
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
780
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.8k
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
850
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
18k
5分で問診!Composer セキュリティ健康診断
codmoninc
0
990
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
110
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
470
Featured
See All Featured
The Spectacular Lies of Maps
axbom
PRO
1
910
Side Projects
sachag
455
43k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.7k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Facilitating Awesome Meetings
lara
57
7.1k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Building Applications with DynamoDB
mza
96
7.2k
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アイコン適用裏話