두 데이터 구조가 해시 충돌을 처리하는 방법이 누락되었습니다. 블룸 필터는 실제 값을 저장하지 않으므로 필요한 공간은 지정된 배열의 일정한 크기입니다. 대신 전통적인 해시를 사용하면 주어진 모든 값을 저장하려고 시도하므로 시간이 지남에 따라 커집니다.
단순화 된 해시 함수 (예를 들어!)를 고려하십시오 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위치에서 배열을 검사 하고 그 위치는 여전히입니다 . 그렇기 때문에 해시 함수를 추가하면 오 탐지를 줄일 수 있습니다.8g(8) = 80
비교 : 블룸 필터는 k해시 함수를 사용하므로 최대 k임의의 배열 위치에 액세스 할 수 있습니다. 그러나 그 수치는 정확합니다. 해시는 대신 상각 된 일정한 액세스 시간만을 보장하지만 해시 함수 및 입력 데이터의 특성에 따라 생성되지 않을 수 있습니다. 따라서 생성되지 않은 경우를 제외하고 일반적으로 더 빠릅니다.
그러나 해시 충돌이 발생하면 표준 해시는 저장된 값과 쿼리 값이 같은지 확인해야합니다. 이 동등성 검사는 임의로 비쌀 수 있으며 블룸 필터에서는 발생하지 않습니다.
공간과 관련하여 지정된 배열보다 더 많은 메모리를 사용할 필요가 없기 때문에 블룸 필터는 일정합니다. 반면 해시는 동적으로 커지고 충돌하는 값을 추적해야하기 때문에 훨씬 커질 수 있습니다.
절충 : 이제 무엇이 싸고 무엇이 아닌지 어떤 상황에서 알았는지, 절충을 볼 수 있어야합니다. 블룸 필터는 이전에 값을 보았지만 오탐 (false positive)으로 살 수 있다는 것을 매우 빠르게 감지하려는 경우 유용합니다. 반면 런타임을 정확하게 판단 할 수없는 가격으로 정확성을 보장하려는 경우 해시 맵을 선택할 수 있지만 평균보다 훨씬 느린 경우에 따라 변질 된 경우는 수용 할 수 있습니다.
마찬가지로, 제한된 메모리 환경에있는 경우 메모리 사용 보장을 위해 블룸 필터를 선호 할 수 있습니다.