나는 블룸 필터를 읽고 있는데 그들은 단지 어리석은 것처럼 보입니다. 블룸 필터로 수행 할 수있는 모든 작업은 다중이 아닌 단일 해시 함수를 사용하여 더 적은 공간에서 더 효율적으로 수행 할 수 있습니다. 블룸 필터를 사용하는 이유는 무엇이며 어떻게 유용합니까?
나는 블룸 필터를 읽고 있는데 그들은 단지 어리석은 것처럼 보입니다. 블룸 필터로 수행 할 수있는 모든 작업은 다중이 아닌 단일 해시 함수를 사용하여 더 적은 공간에서 더 효율적으로 수행 할 수 있습니다. 블룸 필터를 사용하는 이유는 무엇이며 어떻게 유용합니까?
답변:
에서 위키 백과 :
블룸 필터는 자체 균형 이진 검색 트리, 시도, 해시 테이블 또는 간단한 배열 또는 항목의 연결 목록과 같은 집합을 나타내는 다른 데이터 구조에 비해 강력한 공간 이점이 있습니다. 이들 중 대부분은 데이터 항목 자체를 최소한 저장해야합니다. 이는 적은 수의 비트 (작은 정수의 경우)에서 문자열과 같은 임의의 수의 비트에 이르기까지 어느 곳에서나 필요할 수 있습니다 (시도는 예외입니다. 같은 접두사가있는 요소). 연결된 구조는 포인터에 대한 추가 선형 공간 오버 헤드를 발생시킵니다. 반면에 오류가 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 파일에 자세한 설명이 제공됩니다.
HashSet<String>
테이블은 해시 테이블이 완전히 꽉 찬 최상의 시나리오에서 요소 당 16 바이트를 사용합니다. "버킷"에서 항목 테이블의 항목으로 4 바이트 매핑 list), 캐시 된 해시 코드의 경우 4 바이트, "다음"포인터의 경우 4 바이트, 키에 대한 포인터의 경우 4 바이트. 그리고 그것은 문자열 크기를 계산하지 않습니다. 최악의 경우 40 바이트입니다. String
64 비트 아키텍처의 경우 포인터가 8 바이트로 확장 되면 항목의 절반이 사용되지 않고 항목 당 20 바이트가됩니다 .
블룸 필터가 무엇인지, 무엇을 할 수 있고 무엇을 할 수 없는지, 왜 필요한지 설명하고, 어떻게 작동하는지 직관적 인 설명을 보여주고, 유용 할 때 몇 가지 예를 들어 보겠습니다.
소위 표준 꽃 필터 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
해시 도 계산하고 그중 하나 이상이 설정되지 않은 경우 반드시 세트에 없습니다. 그렇지 않으면 세트에있을 수 있습니다.이 설명조차도 우리가 확신 할 수없는 이유를 이해하기에 충분합니다 (여러 다른 다양한 값에서 모든 비트를 설정할 수 있음). 여기 그것이 작동하는 방법의 아주 좋은 시각화 .
그렇다면 블룸 필터는 언제 유용할까요? 짧은 대답은 오탐이 허용되는 곳과 세트에 무언가가 있는지 확인하려는 곳 이지만 그렇지 않더라도 검증 자에게 값 비싼 호출을 배제하는 첫 번째 방어선이 될 수 있습니다.
다음은보다 구체적인 설명 목록입니다.
블룸 필터는 생물 정보학에서 매우 유용합니다. 특히 작업중인 문자열의 크기가 매우 작은 알파벳 (예 : {A, G, T, C})이있는 수억 개의 문자가 될 수있는 경우 일반 해시를 사용하는 것보다 공간 효율적일 수 있습니다. 일반적으로 특정 k-mer가 게놈에 존재하는지 여부를 평가하는 데 사용됩니다. 여기에 관련된 무언가에 사용 된 예가 있습니다 .
편집하다:
여러 해시 함수는 오탐을 최소화하는 데 사용됩니다. 희망은 모든 k-hash 함수 사이에서 각 값이 다른 모든 가능한 값과 비교하여 비트 배열에서 고유 한 서명을 갖게되는 것입니다. 그러나 오탐이 존재하지만 관리 가능한 수준으로 최소화 할 수 있습니다. 이 기술을 사용하면 크기에 관계 없이 요소를 해시 할 수 있습니다. 검색 할 때 각 해시 함수를 사용하고 비트 값이 모두 1인지 확인합니다.
이를 인간 게놈과 비교하면 요소의 크기가 증가하면 해시 테이블의 크기가 크게 증가합니다 (테이블 크기는 4 * 4 k ). 이것은 2 비트 / 문자를 사용하여 요소를 인코딩한다고 가정합니다.