나는 블룸 필터를 읽고 있는데 그들은 단지 어리석은 것처럼 보입니다. 블룸 필터로 수행 할 수있는 모든 작업은 다중이 아닌 단일 해시 함수를 사용하여 더 적은 공간에서 더 효율적으로 수행 할 수 있습니다. 블룸 필터를 사용하는 이유는 무엇이며 어떻게 유용합니까?
답변
에서 위키 백과 :
블룸 필터는 자체 균형 이진 검색 트리, 시도, 해시 테이블 또는 간단한 배열 또는 항목의 연결 목록과 같은 집합을 나타내는 다른 데이터 구조에 비해 강력한 공간 이점이 있습니다. 이들 중 대부분은 데이터 항목 자체를 최소한 저장해야합니다. 이는 적은 수의 비트 (작은 정수의 경우)에서 문자열과 같은 임의의 수의 비트에 이르기까지 어느 곳에서나 필요할 수 있습니다 (시도는 예외입니다. 같은 접두사가있는 요소). 연결된 구조는 포인터에 대한 추가 선형 공간 오버 헤드를 발생시킵니다. 반면에 오류가 1 %이고 최적 값이 k 인 Bloom 필터는 요소의 크기에 관계없이 요소 당 약 9.6 비트 만 필요합니다. 이 장점은 부분적으로는 어레이에서 상속 된 컴팩트 함에서 비롯됩니다. 부분적으로는 확률 론적 성격 때문입니다. 1 %의 오 탐률이 너무 높으면 요소 당 약 4.8 비트를 추가 할 때마다 10 배씩 감소시킵니다.
나에게 꽤 명확합니다.
블룸 필터는 요소 자체를 저장하지 않습니다. 이것이 중요한 포인트입니다. 요소가 있는지 테스트하는 데 블룸 필터를 사용 하지 않고 거짓 부정을 보장하지 않으므로 확실히 존재 하지 않는지 테스트하는 데 사용합니다 . 이렇게하면 집합에 존재하지 않는 요소 (예 : 조회를위한 디스크 IO)에 대해 추가 작업을 수행 할 수 없습니다.
그리고 모두 해시 테이블 (대용량 데이터 세트의 경우 디스크에 부분적으로있을 가능성이 높음)과 같은 것보다 훨씬 적은 공간에 있습니다. 해시 테이블과 같은 구조 와 함께 블룸 필터 를 사용할 수 있지만 일단 요소가 존재할 가능성이 있다고 확신하면.
따라서 예제 사용 패턴은 다음과 같습니다.
디스크에 많은 데이터가 있습니다 . m 값을 규정하는 원하는 오류 범위 (예 : 1 %)를 결정합니다 . 그런 다음 최적의 k 가 결정됩니다 (기사에 제공된 공식에서). 이 디스크 바인딩 데이터에서 필터를 한 번 채 웁니다.
이제 RAM에 필터가 있습니다. 일부 요소를 처리해야하는 경우 필터를 쿼리하여 데이터 세트에 존재할 가능성이 있는지 확인합니다. 그렇지 않은 경우 추가 작업이 수행되지 않습니다. 디스크 읽기 등이 없습니다 (해시 나 트리 등의 경우 수행해야 할 작업).
그렇지 않고 필터에 “예, 거기에 있습니다”라고 표시되면 1 %의 확률로 잘못된 것이므로 알아 내기 위해 필요한 작업을 수행합니다. 시간의 99 %가, 정말 할 일이 수포이 없었다,가.
답변
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 파일에 자세한 설명이 제공됩니다.
답변
블룸 필터가 무엇인지, 무엇을 할 수 있고 무엇을 할 수 없는지, 왜 필요한지 설명하고, 어떻게 작동하는지 직관적 인 설명을 보여주고, 유용 할 때 몇 가지 예를 들어 보겠습니다.
소위 표준 꽃 필터 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 필터를 사용하여 웹 객체에 대한 두 번째 요청을 감지하고 두 번째 요청에서만 해당 객체를 캐싱하면 원 히트 불가사의가 디스크 캐시에 들어가는 것을 방지하여 디스크 워크로드를 크게 줄이고 디스크 캐시 적중률을 높입니다 (블룸 필터의 예에서 가져옴). 위키 기사)
답변
블룸 필터는 생물 정보학에서 매우 유용합니다. 특히 작업중인 문자열의 크기가 매우 작은 알파벳 (예 : {A, G, T, C})이있는 수억 개의 문자가 될 수있는 경우 일반 해시를 사용하는 것보다 공간 효율적일 수 있습니다. 일반적으로 특정 k-mer가 게놈에 존재하는지 여부를 평가하는 데 사용됩니다. 여기에 관련된 무언가에 사용 된 예가 있습니다 .
편집하다:
여러 해시 함수는 오탐을 최소화하는 데 사용됩니다. 희망은 모든 k-hash 함수 사이에서 각 값이 다른 모든 가능한 값과 비교하여 비트 배열에서 고유 한 서명을 갖게되는 것입니다. 그러나 오탐이 존재하지만 관리 가능한 수준으로 최소화 할 수 있습니다. 이 기술을 사용하면 크기에 관계 없이 요소를 해시 할 수 있습니다. 검색 할 때 각 해시 함수를 사용하고 비트 값이 모두 1인지 확인합니다.
이를 인간 게놈과 비교하면 요소의 크기가 증가하면 해시 테이블의 크기가 크게 증가합니다 (테이블 크기는 4 * 4 k ). 이것은 2 비트 / 문자를 사용하여 요소를 인코딩한다고 가정합니다.
답변
Bloom 필터가 항목이 세트의 구성원임을 반환하면 오 탐지 가능성이 있습니다. 집합의 멤버 자격을 나타내는 데 단일 해시 함수 만 사용 된 경우 여러 해시 함수를 사용하는 것보다 거짓 긍정 확률이 높아집니다.