두 데이터 구조가 해시 충돌을 처리하는 방법이 누락되었습니다. 블룸 필터는 실제 값을 저장하지 않으므로 필요한 공간은 지정된 배열의 일정한 크기입니다. 대신 전통적인 해시를 사용하면 주어진 모든 값을 저장하려고 시도하므로 시간이 지남에 따라 커집니다.
단순화 된 해시 함수 (예를 들어!)를 고려하십시오 f(x) = x % 2
. 이제 다음 정수를 입력하십시오 2, 3, 4, 5, 6, 7
..
표준 해시 : 주어진 값이 해시됩니다, 우리는 인해 충돌의 많은 끝 f(2) = f(4) = f(6) = 0
과 f(3) = f(5) = f(7) = 1
. 그럼에도 불구하고 해시는 이러한 모든 값을 저장하며 값 8
이 저장되어 있지 않다는 것을 알 수 있습니다. 어떻게합니까? 충돌을 추적하고 모든 값을 동일한 해시 값으로 저장 한 다음 쿼리 할 때 쿼리를 추가로 비교합니다. 따라서에 대한 맵을 쿼리 해 봅시다 8
: f(8) = 0
이미 삽입 한 버킷을 살펴보고 입력의 일부가 아닌 2, 4, 6
것을 알려면 3 번의 비교가 필요합니다 8
.
블룸 필터 : 일반적으로 각 입력 값은 k
다른 해시 함수 에 대해 해시됩니다. 다시 한 번, 단순성을 위해 단일 해시 함수 만 사용한다고 가정 해 봅시다 f
. 우리는 2 개의 값으로 구성된 배열이 필요하며 입력 2
을 받으면 f(2) = 0
배열 값을 위치 0
로 설정하여 값을 설정 한다는 의미입니다 1
. 동일에 대한 발생 4
및 6
. 마찬가지로 입력은 3, 5, 7
각각 배열 위치 1
를 value로 설정합니다 1
. 이제 경우 우리는 쿼리 8
입력의 일부 : f(8) = 0
위치의 배열이 0
있다 1
, 그래서 꽃 필터 것이다 거짓 주장 8
참으로 입력의 일부였다.
좀 더 사실적으로 표현하기 위해 두 번째 해시 함수를 추가하는 것을 고려해 봅시다 g(x) = x % 10
. 두고, 입력 값의 2
두 해시 값에 이르게 f(2) = 0
하고 g(2) = 2
두 해당 배열의 위치로 설정한다 1
. 물론 배열은 이제 size 이상이어야합니다 10
. 그러나 우리가 쿼리 할 때로 인해 8
위치에서 배열을 검사 하고 그 위치는 여전히입니다 . 그렇기 때문에 해시 함수를 추가하면 오 탐지를 줄일 수 있습니다.8
g(8) = 8
0
비교 : 블룸 필터는 k
해시 함수를 사용하므로 최대 k
임의의 배열 위치에 액세스 할 수 있습니다. 그러나 그 수치는 정확합니다. 해시는 대신 상각 된 일정한 액세스 시간만을 보장하지만 해시 함수 및 입력 데이터의 특성에 따라 생성되지 않을 수 있습니다. 따라서 생성되지 않은 경우를 제외하고 일반적으로 더 빠릅니다.
그러나 해시 충돌이 발생하면 표준 해시는 저장된 값과 쿼리 값이 같은지 확인해야합니다. 이 동등성 검사는 임의로 비쌀 수 있으며 블룸 필터에서는 발생하지 않습니다.
공간과 관련하여 지정된 배열보다 더 많은 메모리를 사용할 필요가 없기 때문에 블룸 필터는 일정합니다. 반면 해시는 동적으로 커지고 충돌하는 값을 추적해야하기 때문에 훨씬 커질 수 있습니다.
절충 : 이제 무엇이 싸고 무엇이 아닌지 어떤 상황에서 알았는지, 절충을 볼 수 있어야합니다. 블룸 필터는 이전에 값을 보았지만 오탐 (false positive)으로 살 수 있다는 것을 매우 빠르게 감지하려는 경우 유용합니다. 반면 런타임을 정확하게 판단 할 수없는 가격으로 정확성을 보장하려는 경우 해시 맵을 선택할 수 있지만 평균보다 훨씬 느린 경우에 따라 변질 된 경우는 수용 할 수 있습니다.
마찬가지로, 제한된 메모리 환경에있는 경우 메모리 사용 보장을 위해 블룸 필터를 선호 할 수 있습니다.