19

BLOOM FILTER

Embed Size (px)

Citation preview

Page 1: BLOOM FILTER
Page 2: BLOOM FILTER

自己紹介

■名前

守谷 純之介(もりや じゅんのすけ)

■所属

リクルートテクノロジーズITM ASG(アプリケーション・ソリューション・グループ)

■仕事

検索・検索・検索

Page 3: BLOOM FILTER

Bloom Filterとは?

• 要素が集合に含まれるか?否か?を判定

• 偽陽性(False Positive)のアルゴリズム

–答え「含まれる」→ あやしい

–答え「含まれない」→ 正しい

• 要素を追加できるが、削除できない

• 元のデータを取り出せない(安全)

• とても小さい(入力サイズに依存しないフットプリント)

• とても速い(入力サイズに依存しない追加と検索)

Page 4: BLOOM FILTER

偽陽性

「H9K4H9」はある?

「ないです」↓

大丈夫、本当にない

「あります」↓

あやしい

Page 5: BLOOM FILTER

偽陽性

偽陽性素数判定プログラム

「素数じゃないです」↓

大丈夫、本当に素数ではない

「素数です」↓

あやしい

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;

}

Page 6: BLOOM FILTER

どこかで使われてるの?

AkamaiGoogle BigTableGoogle ChromeApache LuceneApache HBase

Apache HadoopApache Cassandra

SquidLevelDBOracle

Page 7: BLOOM FILTER

どんな原理なのか?

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 であるか?を検索

Page 8: BLOOM FILTER

追加

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)の例

Page 9: 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 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)の例

Page 10: 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

m(=25)ビット、k(=7)の例

Page 11: BLOOM FILTER

検索

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

×

Page 12: 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

m(=25)ビット、k(=7)の例

Page 13: BLOOM FILTER

検索

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

Page 14: BLOOM FILTER

ハッシュ関数はどのような?

Murmur

FVN

Jenkins Hash

MD5

Kirsch & Mitzenmacher (2006)

※これらの初期値を k 個準備して、値をm で割ればOK

Page 15: BLOOM FILTER

実際のフロー(登録)

「foo」を登録

hash_1(foo) % m, … , hash_k(foo) % m

23, … , 54

Indexの23番目を1, … , indexの54番目を1

Page 16: BLOOM FILTER

実際のフロー(検索)

「bar」を検索

hash_1(bar) % m, … , hash_k(bar) % m

1021, … , 324

Indexの1021番目は1?, … , indexの324番目は1?↓

全部 1 なら「ある」

一つでも 0 なら「ない」

Page 17: BLOOM FILTER

実際にはどれくらい間違うのか?

登録件数を nハッシュ関数が一様に分布

(1-e-kn/m )k

Page 18: BLOOM FILTER

実際の誤り確率

ビット配列長 ハッシュ関数の個数

要素数 誤り確率

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%

Page 19: BLOOM FILTER

THX