- 블룸 필터는 큰 집합의 포함 여부를 적은 메모리로 빠르게 걸러내는 자료구조로, “확실히 없음”과 “있을 수도 있음”만 구분함
- 핵심은 비트 벡터와 여러 해시 함수이며, 삽입 시 해시 결과가 가리키는 위치의 비트를 1로 바꿈
- 조회 때 같은 위치들을 확인해 하나라도 0이면 제외할 수 있지만, 모두 1이어도 거짓 양성 가능성은 남아 있음
- 해시 함수는 독립적이고 균등 분포에 가까우면서 빨라야 하며, md5에서 murmur로 바꿔 약 800% 속도 향상을 얻은 사례가 있음
- 필터의 정확도와 비용은 예상 원소 수 n, 비트 수 m, 해시 수 k의 균형에 달려 있으며 삽입과 조회는 모두 O(k) 수준임
블룸 필터의 동작 방식
- 블룸 필터는 원소가 집합에 포함되는지 빠르고 메모리 효율적으로 판단하는 확률적 자료구조임
- 결과는 두 가지로 제한됨
- 원소가 집합에 확실히 없음
- 원소가 집합에 있을 수도 있음
- 내부 구조는 비트 벡터이며, 원소를 추가할 때 입력을 여러 해시 함수에 통과시킴
- 각 해시값이 가리키는 비트 인덱스를 1로 설정하면 삽입이 끝남
- 예시에서는 Fnv와 Murmur가 단순한 해시 함수로 사용됨
포함 여부 확인과 거짓 양성
- 조회도 삽입 때와 같은 해시 함수들을 사용함
- 해시값이 가리키는 비트 중 하나라도 0이면 해당 원소는 확실히 집합에 없음
- 관련 비트가 모두 1이면 해당 원소가 있을 수도 있음
- 같은 비트들이 다른 원소 하나 또는 여러 원소의 조합으로 이미 설정됐을 수 있음
- 이 충돌 때문에 블룸 필터에는 거짓 양성(false positive) 가능성이 존재함
해시 함수 선택 기준
- 블룸 필터의 해시 함수는 독립적이고 균등 분포에 가까워야 하며, 가능한 한 빨라야 함
- sha1 같은 암호학적 해시는 널리 쓰이지만, 블룸 필터에는 항상 좋은 선택이 아닐 수 있음
- 빠르고 단순한 해시 예시는 다음과 같음
- 블룸 필터 구현을 md5에서 murmur로 바꾼 뒤 약 800% 속도 향상을 얻은 사례가 있음
실제 구현에서 쓰이는 해시
- 여러 구현체가 블룸 필터에 각기 다른 해시 함수를 사용함
- Chromium: murmur 사용
- Plan9: Mitzenmacher 2005에서 제안한 단순 해시 사용
- Sdroege Bloom filter: fnv1a 사용
- Squid: MD5 사용
- RedisBloom: murmur 사용
- Apache Spark: murmur 사용
- influxdb: xxhash 사용
- bloomd: 처음 두 해시는 murmur, 다음 두 해시는 SpookyHash, 이후 해시는 둘의 조합 사용
- fleur, flor, bloom: fnv 사용
- Sqlite: 분석 쿼리용 블룸 필터 추가
- RocksDB: 설정 가능하며, 소스에서는 xxhash 계열의 xxh3가 가장 좋았다고 밝힘
- ScyllaDB: murmur 사용
필터 크기와 해시 함수 수 정하기
- 블룸 필터는 거짓 양성률을 조정할 수 있음
- 더 큰 필터는 거짓 양성이 줄어듦
- 더 작은 필터는 거짓 양성이 늘어남
- 거짓 양성률은 대략
(1-e^-kn/m)^k로 계산됨- n: 삽입할 것으로 예상되는 원소 수
- m: 필터의 비트 수
- k: 해시 함수 수
- 해시 함수가 많을수록 조회와 삽입이 느려지고 필터도 더 빨리 채워짐
- 반대로 해시 함수가 너무 적으면 거짓 양성이 지나치게 많아질 수 있음
- 주어진 m과 n에서 최적의 k는
(m/n)ln(2)로 선택할 수 있음 - 필터 크기는 다음 순서로 맞춰 볼 수 있음
- 예상 n 값을 대략 정함
- m 값을 선택함
- 최적의 k 값을 계산함
- 선택한 n, m, k로 오류율을 계산함
- 오류율을 받아들이기 어렵다면 m을 바꿔 다시 계산함
성능과 적합한 사용 조건
- m비트와 k개 해시 함수를 가진 블룸 필터에서 삽입과 포함 여부 확인은 모두 O(k) 임
- 원소를 추가하거나 조회할 때는 원소를 k개 해시 함수에 통과시키고 해당 비트를 설정하거나 확인하면 됨
- 공간 효율은 허용 가능한 오류율에 따라 달라짐
- 삽입 가능한 원소의 범위가 매우 제한적이면 결정적 비트 벡터가 더 나을 수 있음
- 삽입될 원소 수를 대략이라도 추정할 수 없다면 해시 테이블이나 scalable Bloom filter가 더 적합할 수 있음
참고 자료와 활용 예
- 블룸 필터 활용 예시는 Wikipedia의 Bloom filter 예시에서 볼 수 있음
- C. Titus Brown의 발표는 생물정보학에서 블룸 필터를 쓰는 사례를 다룸
- 주요 참고 자료