블룸 필터를 사용하면 어떤 이점이 있습니까?


108

나는 블룸 필터를 읽고 있는데 그들은 단지 어리석은 것처럼 보입니다. 블룸 필터로 수행 할 수있는 모든 작업은 다중이 아닌 단일 해시 함수를 사용하여 더 적은 공간에서 더 효율적으로 수행 할 수 있습니다. 블룸 필터를 사용하는 이유는 무엇이며 어떻게 유용합니까?


5
위키피디아 기사를 읽었습니까? 장점을 잘 설명합니다. en.wikipedia.org/wiki/Bloom_filter
Alex Budovski 2010

하지만 가능성이없는 @david. 상수 공간의 k 해시 함수는 상수 공간의 단일 해시 함수보다 더 많은 충돌을 갖습니다.
두통

1
@Alex 나는 wikipedia 기사를 읽었습니다. 나는 거기에서 말한 것을 이해하지만 그것이 왜 더 나은지 이해하지 못합니다. 작동하는 이유는 직관적입니다. 왜 유용하지 않습니다.
두통

이 작가는 그것으로 좋은 작업 않습니다 michaelnielsen.org/ddi/why-bloom-filters-work-the-way-they-do
dranxo

2
@dranxo, 링크 된 기사 jasondavies.com/bloomfilter 가 더 좋습니다.
Pacerier

답변:


155

에서 위키 백과 :

블룸 필터는 자체 균형 이진 검색 트리, 시도, 해시 테이블 또는 간단한 배열 또는 항목의 연결 목록과 같은 집합을 나타내는 다른 데이터 구조에 비해 강력한 공간 이점이 있습니다. 이들 중 대부분은 데이터 항목 자체를 최소한 저장해야합니다. 이는 적은 수의 비트 (작은 정수의 경우)에서 문자열과 같은 임의의 수의 비트에 이르기까지 어느 곳에서나 필요할 수 있습니다 (시도는 예외입니다. 같은 접두사가있는 요소). 연결된 구조는 포인터에 대한 추가 선형 공간 오버 헤드를 발생시킵니다. 반면에 오류가 1 %이고 최적 값이 k 인 Bloom 필터는 요소의 크기에 관계없이 요소 당 약 9.6 비트 만 필요합니다. 이 장점은 부분적으로는 어레이에서 상속 된 컴팩트 함에서 비롯됩니다. 부분적으로는 확률 론적 성격 때문입니다. 1 %의 오 탐률이 너무 높으면 요소 당 약 4.8 비트를 추가 할 때마다 10 배씩 감소시킵니다.

나에게 꽤 명확합니다.

블룸 필터는 요소 자체를 저장하지 않습니다. 이것이 중요한 포인트입니다. 요소가 있는지 테스트하는 데 블룸 필터를 사용 하지 않고 거짓 부정을 보장하지 않으므로 확실히 존재 하지 않는지 테스트하는 데 사용합니다 . 이렇게하면 집합에 존재하지 않는 요소 (예 : 조회를위한 디스크 IO)에 대해 추가 작업을 수행 할 수 없습니다.

그리고 모두 해시 테이블 (대용량 데이터 세트의 경우 디스크에 부분적으로있을 가능성이 높음)과 같은 것보다 훨씬 적은 공간에 있습니다. 해시 테이블과 같은 구조 함께 블룸 필터 사용할 수 있지만 일단 요소가 존재할 가능성이 있다고 확신하면.

따라서 예제 사용 패턴은 다음과 같습니다.

디스크에 많은 데이터가 있습니다 . m 값을 규정하는 원하는 오류 범위 (예 : 1 %)를 결정합니다 . 그런 다음 최적의 k 가 결정됩니다 (기사에 제공된 공식에서). 이 디스크 바인딩 데이터에서 필터를 한 번 채 웁니다.

이제 RAM에 필터가 있습니다. 일부 요소를 처리해야하는 경우 필터를 쿼리하여 데이터 세트에 존재할 가능성이 있는지 확인합니다. 그렇지 않은 경우 추가 작업이 수행되지 않습니다. 디스크 읽기 등이 없습니다 (해시 나 트리 등의 경우 수행해야 할 작업).

그렇지 않고 필터에 "예, 거기에 있습니다"라고 표시되면 1 %의 확률로 잘못된 것이므로 알아 내기 위해 필요한 작업을 수행합니다. 시간의 99 %가, 정말 일이 수포이 없었다,가.


2
명확하다면 대답 해주십시오. 이것이 같은 크기의 집합에 대한 단일 해시 함수보다 어떻게 더 공간 효율적일 수 있습니까? 이것은 단순히 더 많은 충돌을 생성합니다. 모든 해시 함수에 1이 있는지 확인하기 위해 별도의 해시 함수 검색을 돌아 다닐 것입니다. 단일 해시 함수를 사용하는 것보다 이점이 있다는 것을 이해하지 못합니다.
두통

19
해시 함수는 데이터가 아니라 코드입니다. 해시 함수를 무엇과 함께 사용 하시겠습니까? 해시 테이블? 이 경우 테이블에 블룸 필터와 달리 임의의 크기가 될 수있는 키를 저장해야합니다. 발췌문에서 이것을 언급합니다.
Alex Budovski 2010

3
k가 아닌 해시 함수가 하나만있는 블룸 필터를 고려하십시오. 더 많은 해시 함수를 추가하면 어떤 이점이 있습니까? 이것은 단순히 더 많은 충돌을 생성합니다. 아니면 내가 틀렸나 요?
두통

2
위키 백과 기사의 "공간 및 시간 이점"의 마지막 단락과 "오 탐지 가능성"섹션에서 이에 대한 답을 찾을 수 있습니다.
Alex Budovski 2010

4
방금 클릭했습니다. 정말 감사합니다. 이것은 잠시 동안 저를 괴롭 혔습니다. 거짓 양성은 a) 모든 해시 함수에 대한 충돌이거나 b) 모든 공백이 다른 값으로 채워 져야하기 때문에 거짓 양성의 수를 줄입니다. 크기를 선택하는 것은 까다로운 과정 인 것 같습니다. 내가 틀렸다면 정정 해주세요.하지만 알 것 같아요. 모든 분에게 감사합니다.
두통

156

Alex는 그것을 아주 잘 설명했습니다. 아직 이해하지 못한 사람들을 위해이 예제가 다음을 이해하는 데 도움이되기를 바랍니다.

Chrome 팀에서 Google에서 일하고 사용자가 입력 한 URL이 악성 URL 인 경우 사용자에게 알리는 기능을 브라우저에 추가하고 싶다고 가정 해 보겠습니다. 약 1 백만 개의 악성 URL 데이터 세트가 있는데,이 파일의 크기는 약 25MB입니다. 크기가 상당히 크기 때문에 (브라우저 자체의 크기에 비해 큼)이 데이터를 원격 서버에 저장합니다.

사례 1 : 해시 테이블과 함께 해시 함수를 사용합니다. 효율적인 해싱 기능을 결정하고 해시 기능을 통해 100 만 개의 URL을 모두 실행하여 해시 키를 얻습니다. 그런 다음 해시 테이블 (배열)을 만듭니다. 여기서 해시 키는 해당 URL을 배치 할 인덱스를 제공합니다. 이제 해싱 테이블을 해시하고 채우면 크기를 확인합니다. 키와 함께 해시 테이블에 1 백만 개의 URL을 모두 저장했습니다. 따라서 크기는 최소 25MB입니다. 이 해시 테이블은 크기 때문에 원격 서버에 저장됩니다. 사용자가 찾아와 주소창에 URL을 입력하면 악성인지 확인해야합니다. 따라서 해시 기능을 통해 URL을 실행하고 (브라우저 자체가이를 수행 할 수 있음) 해당 URL에 대한 해시 키를 얻습니다. 이제 해시 키를 사용하여 원격 서버에 요청해야합니다. 특정 키가있는 내 해시 테이블의 특정 URL이 사용자가 입력 한 것과 동일한 지 확인합니다. 그렇다면 그것은 악의적이며 그렇지 않다면 그것은 악의적이지 않습니다. 따라서 사용자가 URL을 입력 할 때마다 해당 URL이 악성 URL인지 확인하기 위해 원격 서버에 요청해야합니다. 이것은 많은 시간이 걸리므로 브라우저 속도가 느려집니다.

사례 2 : 나는 블룸 필터를 사용합니다. 1 백만 개의 URL 전체 목록은 여러 해시 함수를 사용하여 블룸 필터를 통해 실행되며 각 위치는 0의 거대한 배열에서 1로 표시됩니다. 블룸 필터 계산기 ( http://hur.st/bloomfilter?n=1000000&p=0.01), 필요한 블룸 필터의 크기는 1.13MB에 불과합니다. 이 작은 크기는 배열의 크기가 크더라도 해시 테이블의 경우처럼 URL이 아닌 1 또는 0 만 저장하기 때문에 예상되며이 배열은 비트 배열로 취급 할 수 있습니다. 즉, 1과 0의 두 값만 있기 때문에 바이트 대신 개별 비트를 설정할 수 있습니다. 이렇게하면 차지하는 공간이 8 배 줄어 듭니다. 이 1.13MB 블룸 필터는 크기가 작기 때문에 웹 브라우저 자체에 저장할 수 있습니다 !! 따라서 사용자가 URL을 입력 할 때 필요한 해시 함수 (브라우저 자체에서)를 적용하고 블룸 필터 (브라우저에 저장 됨)의 모든 위치를 확인하기 만하면됩니다. 모든 위치의 값이 0이면이 URL이 악성 URL 목록에 확실히 포함되어 있지 않으며 사용자가 자유롭게 진행할 수 있음을 나타냅니다. 따라서 우리는 서버를 호출하지 않았으므로 시간을 절약했습니다. 값 1은 URL이 악성 URL 목록에있을 수 있음을 나타냅니다. 이 경우 우리는 원격 서버를 호출하고 거기에서 URL이 실제로 존재하는지 검색하고 확인하기 위해 첫 번째 경우와 같이 일부 해시 테이블과 함께 다른 해시 함수를 사용할 수 있습니다. 대부분의 경우 URL은 악의적 인 URL이 아닐 가능성이 높으므로 브라우저의 작은 블룸 필터가이를 파악하여 원격 서버에 대한 호출을 피하여 시간을 절약합니다. 경우에 따라 블룸 필터가 URL이 악성 일 수 있다고 알려주는 경우에만 서버를 호출합니다. 그 'MIGHT'이 99 % 맞습니다. 이 경우 우리는 원격 서버를 호출하고 거기에서 URL이 실제로 존재하는지 검색하고 확인하기 위해 첫 번째 경우와 같이 일부 해시 테이블과 함께 다른 해시 함수를 사용할 수 있습니다. 대부분의 경우 URL은 악의적 인 URL이 아닐 가능성이 높으므로 브라우저의 작은 블룸 필터가이를 파악하여 원격 서버에 대한 호출을 피하여 시간을 절약합니다. 경우에 따라 블룸 필터가 URL이 악성 일 수 있다고 알려주는 경우에만 서버를 호출합니다. 그 'MIGHT'이 99 % 맞습니다. 이 경우 우리는 원격 서버를 호출하고 거기에서 URL이 실제로 존재하는지 검색하고 확인하기 위해 첫 번째 경우와 같이 일부 해시 테이블과 함께 다른 해시 함수를 사용할 수 있습니다. 대부분의 경우 URL은 악의적 인 URL이 아닐 가능성이 높으므로 브라우저의 작은 블룸 필터가이를 파악하여 원격 서버에 대한 호출을 피하여 시간을 절약합니다. 경우에 따라 블룸 필터가 URL이 악성 일 수 있다고 알려주는 경우에만 서버를 호출합니다. 그 'MIGHT'이 99 % 맞습니다. 브라우저의 스몰 블룸 필터는이를 파악하여 원격 서버에 대한 호출을 피함으로써 시간을 절약합니다. 경우에 따라 블룸 필터가 URL이 악성 일 수 있다고 알려주는 경우에만 서버를 호출합니다. 그 'MIGHT'이 99 % 맞습니다. 브라우저의 스몰 블룸 필터는이를 파악하여 원격 서버에 대한 호출을 피함으로써 시간을 절약합니다. 경우에 따라 블룸 필터가 URL이 악성 일 수 있다고 알려주는 경우에만 서버를 호출합니다. 그 'MIGHT'이 99 % 맞습니다.

따라서 브라우저에서 작은 블룸 필터를 사용하여 입력 된 모든 URL에 대해 서버 호출을 할 필요가 없기 때문에 많은 시간을 절약했습니다.

단일 해시 함수가있는 해시 테이블이 블룸 필터와는 다른 목적으로 사용되는 것을 볼 수 있습니다. 바라건대 이것은 당신의 의심을 없애줍니다. :)

편집 :

Python에서 악성 URL 테스트 작업을 위해 블룸 필터를 구현했습니다. 코드는 여기에서 찾을 수 있습니다. https://github.com/tarunsharma1/Bloom-Filter 코드는 이해하기 매우 간단하며 readme 파일에 자세한 설명이 제공됩니다.


3
사용 사례 시나리오에 감사드립니다.
Squiggs.

1
0 또는 1의 값을 해싱하고 연결하는 부분을 얻지 못했습니다. 배열을 사용하고 여기에 0과 1을 저장하는 경우 테스트를 수행 할 때 URL의 해시 값을 어떻게 찾습니까? ?
divinedragon 2015-08-12

1
그래서 기본적으로 우리는 URL을 문자열로 받아들이고 숫자를 제공하는 해시 함수라는 것을 사용합니다. 우리는이 숫자를 사용하고 해당 배열 인덱스 값을 1로 설정합니다. 여러 해싱 함수가 존재합니다. 그러나 중요한 것은 동일한 URL이 해싱 함수를 통해 전달 될 때마다 동일한 번호를 생성해야한다는 것입니다. 해싱 함수의 예는 URL에있는 모든 문자의 ASCII 값을 더하는 것입니다. 블룸 필터에서 우리는 많은 해싱 함수를 사용하고 모든 배열 인덱스 값을 1로 설정합니다.
Tarun

1
C #과 같은 기존의 해시 HashSet<String>테이블은 해시 테이블이 완전히 꽉 찬 최상의 시나리오에서 요소 당 16 바이트를 사용합니다. "버킷"에서 항목 테이블의 항목으로 4 바이트 매핑 list), 캐시 된 해시 코드의 경우 4 바이트, "다음"포인터의 경우 4 바이트, 키에 대한 포인터의 경우 4 바이트. 그리고 그것은 문자열 크기를 계산하지 않습니다. 최악의 경우 40 바이트입니다. String64 비트 아키텍처의 경우 포인터가 8 바이트로 확장 되면 항목의 절반이 사용되지 않고 항목 당 20 바이트가됩니다 .
Qwertie

해시 세트에 문자열 자체를 저장할 필요가 없습니다. 해시를 값으로 저장하여 해시 세트를 훨씬 더 작게 만들 수 있습니다. 그런 다음 해시 크기를 가지고 놀 수 있습니다. 크기가 클수록 오 탐률이 작아집니다.
user1028741

24

블룸 필터가 무엇인지, 무엇을 할 수 있고 무엇을 할 수 없는지, 왜 필요한지 설명하고, 어떻게 작동하는지 직관적 인 설명을 보여주고, 유용 할 때 몇 가지 예를 들어 보겠습니다.

소위 표준 꽃 필터 A는 확률 적 데이터 구조는* :


  • 세트에 요소 추가
  • definitely not in the set또는 말하여 요소가 세트에 있는지 확인하십시오.possibly in the set

이것이 possibly in the set바로 확률론이라고 불리는 이유입니다. 똑똑한 단어를 사용하면 오탐 이 가능하지만 (요소가 긍정이라고 잘못 생각하는 경우가있을 수 있음) 오탐은 불가능합니다.

그러나 그것은 수 없습니다 * :

  • 세트에서 항목을 제거하다
  • 현재 세트에있는 모든 요소의 목록을 제공합니다.

* 이 세트는 기본 블룸 필터 용입니다. 오래 전에 생성 된 유용한 데이터 구조이기 때문에 사람들 은 다른 유용한 기능으로 이를 보강 하는 방법을 발견 했습니다 .


그러나 잠시만 기다려주세요. 우리는 모호한 '가능함'과 모든 제한 (제거 할 수 없음, 모두 표시 할 수 없음)없이이 모든 것에 답할 수있는 데이터 구조를 이미 알고 있습니다. 그리고 그것을 세트 라고합니다 . 그리고 여기에 블룸 필터의 주요 이점이 있습니다. 공간 효율적이고 공간이 일정 합니다.

이것은 우리가 거기에 얼마나 많은 요소를 저장하는지는 중요하지 않으며 공간은 동일하다는 것을 의미합니다. 예, 10^6요소가 있는 블룸 필터 (쓸모없는 블룸 필터)는 10^20요소가 있는 블룸 필터와 동일한 공간을 차지하고 요소가 있는 블룸 필터와 동일한 공간을 차지합니다 0. 그렇다면 얼마나 많은 공간이 필요할까요? 결정하는 것은 귀하에게 달려 있습니다 (그러나 거래가 있습니다 : 요소가 많을수록 possible in the set답 이 불확실합니다 .

또 다른 멋진 점은 공간이 일정하다는 것입니다. 데이터를 세트에 저장할 때 실제로이 데이터를 저장해야합니다. 따라서 저장하는 경우 this long string in the set최소한 27 바이트의 공간을 사용해야합니다. 그러나 1 % 오류와 k ** 의 최적 값의 경우 모든 요소 (짧은 int이든 거대한 텍스트 벽이든) 당 ~ 9.6 비트 (<2 바이트)가 필요합니다.

또 다른 특성은 모든 작업이 일정 시간을 소요한다는 것입니다. 이는 집합의 경우 상각 된 일정 시간과 절대적으로 동일하지 않습니다 (집합에 충돌이 있으면 O(n)시간 이 저하 될 수 있음을 기억하십시오 ).

** k는 블룸 필터에 사용되는 해시 함수의 값입니다.


나는 블룸 필터가 어떻게 작동 하는지 설명하지 않을 것입니다 (위키피디아 기사는 모든 것을 설명하는 아주 좋은 일을합니다). 여기서는 기본에 대해 간단히 설명하겠습니다.

  • 길이의 빈 비트 배열을 시작합니다. m
  • k다른 해시 함수 를 선택 합니다 (더 독립적 일수록 좋습니다).
  • 요소를 추가하려면 k이 값의 모든 해시 를 계산 하고 해당 비트를 1로 설정합니다.
  • 요소가 있는지 확인하려면 모든 k해시 도 계산하고 그중 하나 이상이 설정되지 않은 경우 반드시 세트에 없습니다. 그렇지 않으면 세트에있을 수 있습니다.

이 설명조차도 우리가 확신 할 수없는 이유를 이해하기에 충분합니다 (여러 다른 다양한 값에서 모든 비트를 설정할 수 있음). 여기 그것이 작동하는 방법의 아주 좋은 시각화 .

여기에 이미지 설명 입력


그렇다면 블룸 필터는 언제 유용할까요? 짧은 대답은 오탐이 허용되는 곳과 세트에 무언가가 있는지 확인하려는 곳 이지만 그렇지 않더라도 검증 자에게 값 비싼 호출을 배제하는 첫 번째 방어선이 될 수 있습니다.

다음은보다 구체적인 설명 목록입니다.

  • 악성 웹 사이트 및 브라우저 의 표준 예는 사람들이 블룸 필터에 대해 이야기하는 거의 모든 에서 설명됩니다.
  • 취약한 암호입니다. 가능한 모든 취약한 암호 세트를 사용하는 대신 더 작은 블룸 필터를 사용하여 암호가 확실히 취약하지 않은지 확인할 수 있습니다.
  • 기사 목록과 사용자 목록이있는 경우 블룸 필터를 사용하여 읽지 않은 사용자의 기사를 표시 할 수 있습니다. 흥미로운 점은 하나의 필터 만 가질 수 있다는 것입니다 (user_id + article_id의 조합이 있는지 확인).
  • 비트 코인 은 지갑 동기화를 위해 블룸 필터를 사용합니다.
  • Akamai의 웹 서버는 Bloom 필터를 사용하여 "원 히트 원더"가 디스크 캐시에 저장되는 것을 방지합니다. One-hit-wonder는 사용자가 한 번만 요청한 웹 개체로, Akamai는 캐싱 인프라의 거의 4 분의 3에 적용된 것으로 나타났습니다. Bloom 필터를 사용하여 웹 객체에 대한 두 번째 요청을 감지하고 두 번째 요청에서만 해당 객체를 캐싱하면 원 히트 불가사의가 디스크 캐시에 들어가는 것을 방지하여 디스크 워크로드를 크게 줄이고 디스크 캐시 적중률을 높입니다 (블룸 필터의 예에서 가져옴). 위키 기사)

13

블룸 필터는 생물 정보학에서 매우 유용합니다. 특히 작업중인 문자열의 크기가 매우 작은 알파벳 (예 : {A, G, T, C})이있는 수억 개의 문자가 될 수있는 경우 일반 해시를 사용하는 것보다 공간 효율적일 수 있습니다. 일반적으로 특정 k-mer가 게놈에 존재하는지 여부를 평가하는 데 사용됩니다. 여기에 관련된 무언가에 사용 된 예가 있습니다 .

편집하다:

여러 해시 함수는 오탐을 최소화하는 데 사용됩니다. 희망은 모든 k-hash 함수 사이에서 각 값이 다른 모든 가능한 값과 비교하여 비트 배열에서 고유 한 서명을 갖게되는 것입니다. 그러나 오탐이 존재하지만 관리 가능한 수준으로 최소화 할 수 있습니다. 이 기술을 사용하면 크기에 관계 없이 요소를 해시 할 수 있습니다. 검색 할 때 각 해시 함수를 사용하고 비트 값이 모두 1인지 확인합니다.

이를 인간 게놈과 비교하면 요소의 크기가 증가하면 해시 테이블의 크기가 크게 증가합니다 (테이블 크기는 4 * 4 k ). 이것은 2 비트 / 문자를 사용하여 요소를 인코딩한다고 가정합니다.


1
죄송합니다. 오해하고 있지만 일반 해시와 비교하여 어떻게 더 공간 효율적일 수 있습니까? 문자열의 해시는 고정 길이 출력이며이 값을 0 또는 1로 설정하기 만하면됩니다. 이것은 블룸 필터가 수행하는 작업이기도하지만 블룸 필터는 여러 해시 함수 에 대해 수행합니다 . 오해는 어디입니까?
두통

하나의 해시 만 저장하는 것은별로 소용이 없습니다. 그러면 해시 충돌을 처리 할 방법이 없습니다. 대부분의 해시 테이블 구현에는 오버 헤드가 발생하는이를 처리하는 방법이 있습니다. 예를 들어 Python 사전은 해시와 함께 키를 저장하고 충돌시 선형으로 프로빙을 시작합니다. 블룸 필터는이를 잘라 내고 여러 해시를 사용하여 발생하는 손상을 최소화하려고합니다.
Bret Fontecchio 2014 년

1
블룸 필터를 생성하지 않고 해시 함수 하나만 사용하는 이유는 무엇입니까? "상대적으로 큰"해시 함수일 수 있습니다. 그러나 많은 대신 하나
giorgim

7

Bloom 필터가 항목이 세트의 구성원임을 반환하면 오 탐지 가능성이 있습니다. 집합의 멤버 자격을 나타내는 데 단일 해시 함수 만 사용 된 경우 여러 해시 함수를 사용하는 것보다 거짓 긍정 확률이 높아집니다.


대답의 고기에 심각한 정교 필요 " 위양성의 가능성을 여러 해시 함수를 사용하는 것보다 더 높을 것 "...
Pacerier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.