คุณพลาดวิธีที่โครงสร้างข้อมูลสองข้อจัดการกับการชนกันของแฮช ฟิลเตอร์บลูมไม่ได้เก็บค่าจริงดังนั้นพื้นที่ที่ต้องการคือขนาดคงที่ของอาเรย์ที่กำหนด แต่ถ้าคุณใช้แฮชแบบดั้งเดิมมันจะพยายามเก็บค่าทั้งหมดที่คุณให้มาแทนดังนั้นมันจึงเติบโตตามกาลเวลา
พิจารณาฟังก์ชั่นแฮชที่เรียบง่าย (เพื่อเป็นตัวอย่างเท่านั้น!) 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
ไม่ใช่ส่วนหนึ่งของอินพุต
ตัวกรอง Bloom:โดยปกติค่าอินพุตแต่ละค่าจะถูกแฮชกับk
ฟังก์ชันแฮชที่แตกต่างกัน อีกครั้งเพื่อความง่ายเราจะสมมติว่าเราใช้ฟังก์ชันแฮชเพียงครั้งเดียวf
เท่านั้น เราจำเป็นต้องมีอาร์เรย์ของ 2 ค่าแล้วและเมื่อเราพบการป้อนข้อมูล2
ก็หมายความว่าเกิดจากการf(2) = 0
ที่เราตั้งค่าอาร์เรย์ที่ตำแหน่งค่า0
1
เช่นเดียวกับที่เกิดขึ้นและ4
6
ในทำนองเดียวกันปัจจัยการผลิต3, 5, 7
แต่ละชุดตำแหน่งอาร์เรย์จะคุ้มค่า1
1
ตอนนี้เราค้นหาว่า8
เป็นส่วนหนึ่งของอินพุตหรือไม่f(8) = 0
และอาร์เรย์ที่ตำแหน่ง0
นั้น1
ดังนั้นตัวกรอง Bloom จะอ้างว่า8
เป็นส่วนหนึ่งของอินพุตอย่างไม่ถูกต้อง
g(x) = x % 10
ที่จะได้รับบิตสมจริงมากขึ้นให้พิจารณาว่าเราเพิ่มฟังก์ชันแฮชที่สอง กับที่มูลค่าการป้อนข้อมูล2
นำไปสู่สองค่าแฮชf(2) = 0
และทั้งสองที่สอดคล้องตำแหน่งอาร์เรย์จะถูกตั้งค่าg(2) = 2
แน่นอนอาร์เรย์ตอนนี้ควรมีอย่างน้อยขนาด1
10
แต่เมื่อเราสอบถาม8
เราจะตรวจสอบอาร์เรย์ที่ตำแหน่ง8
เนื่องจากg(8) = 8
0
และตำแหน่งที่จะยังคงอยู่ นั่นเป็นเหตุผลที่ฟังก์ชั่นแฮชเพิ่มเติมช่วยลดผลบวกปลอมที่คุณจะได้รับ
เปรียบเทียบ:ฟิลเตอร์บลูมใช้k
ฟังก์ชั่นแฮชซึ่งหมายถึงk
การเข้าถึงตำแหน่งอาเรย์สูงสุดแบบสุ่ม แต่ตัวเลขนั้นแน่นอน แฮชจะรับประกันเฉพาะเวลาเข้าใช้งานที่คงที่ของคุณ แต่อาจยกเลิกการสร้างขึ้นอยู่กับลักษณะของฟังก์ชันแฮชและข้อมูลอินพุตของคุณ ดังนั้นโดยทั่วไปจะเร็วกว่ายกเว้นกรณีที่ถูกยกเลิก
อย่างไรก็ตามเมื่อคุณมีการชนกันของแฮชแฮชมาตรฐานจะต้องตรวจสอบความเท่าเทียมกันของค่าที่เก็บไว้กับค่าของแบบสอบถาม การตรวจสอบความเท่าเทียมกันนี้อาจมีราคาแพงโดยพลการและจะไม่เกิดขึ้นกับฟิลเตอร์บลูม
ในแง่ของพื้นที่ตัวกรองการเบ่งบานคงที่เนื่องจากไม่จำเป็นต้องใช้หน่วยความจำมากกว่าอาเรย์ที่กำหนด ในทางกลับกันแฮชจะเติบโตแบบไดนามิกและอาจมีขนาดใหญ่ขึ้นเนื่องจากต้องติดตามค่าการชนกัน
การแลกเปลี่ยน:ตอนนี้เมื่อคุณรู้ว่าอะไรถูกและอะไรไม่และภายใต้สถานการณ์ใดคุณควรเห็นการแลกเปลี่ยน บลูมตัวกรองนั้นยอดเยี่ยมหากคุณต้องการตรวจจับอย่างรวดเร็วว่ามีการเห็นค่าก่อนหน้านี้ แต่สามารถมีชีวิตอยู่กับผลบวกที่ผิดพลาด ในทางกลับกันคุณสามารถเลือกแผนที่แฮชได้หากคุณต้องการรับประกันความถูกต้องในราคาที่ไม่สามารถตัดสินรันไทม์ของคุณได้อย่างแน่นอน แต่สามารถยอมรับกรณีที่เสื่อมโทรมเป็นครั้งคราวซึ่งอาจช้ากว่าค่าเฉลี่ยมาก
ในทำนองเดียวกันหากคุณอยู่ในสภาพแวดล้อมหน่วยความจำที่ จำกัด คุณอาจต้องการใช้ฟิลเตอร์บลูมเพื่อรับประกันการใช้หน่วยความจำ