bloom filter
TRANSCRIPT
自己紹介
■名前
守谷 純之介(もりや じゅんのすけ)
■所属
リクルートテクノロジーズITM ASG(アプリケーション・ソリューション・グループ)
■仕事
検索・検索・検索
Bloom Filterとは?
• 要素が集合に含まれるか?否か?を判定
• 偽陽性(False Positive)のアルゴリズム
–答え「含まれる」→ あやしい
–答え「含まれない」→ 正しい
• 要素を追加できるが、削除できない
• 元のデータを取り出せない(安全)
• とても小さい(入力サイズに依存しないフットプリント)
• とても速い(入力サイズに依存しない追加と検索)
偽陽性
「H9K4H9」はある?
「ないです」↓
大丈夫、本当にない
「あります」↓
あやしい
?
◯
偽陽性
偽陽性素数判定プログラム
「素数じゃないです」↓
大丈夫、本当に素数ではない
「素数です」↓
あやしい
?
◯
function isPrime(n) {if (2 === n || 3 === n || 5 ===n || 7 === n) {
return true;}if (0 === (n % 2)) {
return false;}if (0 === (n % 3)) {
return false;}if (0 === (n % 5)) {
return false;}if (0 === (n % 7)) {
return false;}return true;
}
どこかで使われてるの?
AkamaiGoogle BigTableGoogle ChromeApache LuceneApache HBase
Apache HadoopApache Cassandra
SquidLevelDBOracle
どんな原理なのか?
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
25bit 版 Bloom Filter初期状態
• Bloom Filter(index)は m bit のビット配列(例は25bit)
• 初期状態では全部 0• k 個のハッシュ関数を定義(k 個のハッシュ関数を準備する必要はなく、異なるk 個の初期値でもOK)
• 一つの要素を追加するとk 個の 1 を登録
• 要素の検索は k 個のビットが 1 であるか?を検索
追加
0 1 1 1 0
0 0 0 1 0
0 0 1 0 0
0 0 1 0 0
0 1 0 0 0
「ア」を登録
0 1 1 1 0
0 0 0 1 0
0 0 1 0 0
0 0 1 0 0
0 1 0 0 0
m(=25)ビット、k(=7)の例
追加
「イ」を登録
0 1 1 1 0
0 0 1 1 0
0 1 1 0 0
1 0 1 0 0
0 1 1 0 0
0 0 0 1 0
0 0 1 0 0
0 1 1 0 0
1 0 1 0 0
0 0 1 0 0
m(=25)ビット、k(=7)の例
検索
「ウ」はあるか?
0 1 1 1 0
0 0 1 1 0
0 1 1 0 0
1 0 1 0 0
0 1 1 0 0
0 0 1 0 0
1 1 1 0 0
1 0 0 1 0
0 0 1 0 0
0 1 0 0 0
m(=25)ビット、k(=7)の例
検索
Bloom Filter 初期状態
「ウ」はあるか?
0 1 1 1 0
0 0 1 1 0
0 1 1 0 0
1 0 1 0 0
0 1 1 0 0
0 0 1 0 0
1 1 1 0 0
1 0 0 1 0
0 0 1 0 0
0 1 0 0 0
OK
×
ない!→ 正しい
OK
×
検索
「T」はあるか?
0 1 1 1 0
0 0 1 1 0
0 1 1 0 0
1 0 1 0 0
0 1 1 0 0
0 1 1 1 0
0 0 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 1 0 0
m(=25)ビット、k(=7)の例
検索
Bloom Filter 初期状態
「T」はあるか?
0 1 1 1 0
0 0 1 1 0
0 1 1 0 0
1 0 1 0 0
0 1 1 0 0
0 1 1 1 0
0 0 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 1 0 0
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
ある!→ 正しくない
OK OK OK OK
ハッシュ関数はどのような?
Murmur
FVN
Jenkins Hash
MD5
Kirsch & Mitzenmacher (2006)
※これらの初期値を k 個準備して、値をm で割ればOK
実際のフロー(登録)
「foo」を登録
↓
hash_1(foo) % m, … , hash_k(foo) % m
↓
23, … , 54
↓
Indexの23番目を1, … , indexの54番目を1
実際のフロー(検索)
「bar」を検索
↓
hash_1(bar) % m, … , hash_k(bar) % m
↓
1021, … , 324
↓
Indexの1021番目は1?, … , indexの324番目は1?↓
全部 1 なら「ある」
一つでも 0 なら「ない」
実際にはどれくらい間違うのか?
登録件数を nハッシュ関数が一様に分布
(1-e-kn/m )k
実際の誤り確率
ビット配列長 ハッシュ関数の個数
要素数 誤り確率
8 bit 4 20 40 %
100 KByte(= 819,200 bit)
8 1,000,000 67%
1 MByte
(= 8,388,608 bit)
8 1,000,000 1.7%
THX