ฉันจะเริ่มต้นด้วยคำอธิบายว่าอะไรคือตัวกรองบลูมสิ่งที่ทำได้และทำไม่ได้ทำไมเราถึงต้องใช้แสดงคำอธิบายที่เข้าใจง่ายว่ามันทำงานอย่างไรจากนั้นจึงยกตัวอย่างบางส่วนที่สามารถใช้ประโยชน์ได้
ดังนั้นตัวกรองบานมาตรฐานจึงเป็นโครงสร้างข้อมูลที่น่าจะเป็นที่สามารถ* :
- เพิ่มองค์ประกอบให้กับชุด
- ตรวจสอบว่าองค์ประกอบอยู่ในชุดโดยการบอก
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 **คุณจะต้องมี ~ 9.6 บิต (<2 ไบต์) ต่อองค์ประกอบใด ๆ (ไม่ว่าจะเป็น int สั้น ๆ หรือข้อความขนาดใหญ่)
คุณสมบัติอีกประการหนึ่งคือการดำเนินการทั้งหมดใช้เวลาคงที่ซึ่งไม่เหมือนกับเวลาคงที่ที่ตัดจำหน่ายอย่างแน่นอนในกรณีของเซต (โปรดจำไว้ว่าหากเซตมีการชนกันก็สามารถเสื่อมสภาพได้O(n)
ตามเวลา)
** k คือค่าของฟังก์ชันแฮชที่ใช้ในตัวกรองบลูม
ฉันจะไม่อธิบายว่าตัวกรองบลูมทำงานอย่างไร (บทความวิกิพีเดียอธิบายทุกอย่างได้ดีมาก) ที่นี่ฉันจะบอกพื้นฐานสั้น ๆ
- คุณเริ่มต้นอาร์เรย์บิตว่างเปล่า
m
- คุณเลือก
k
ฟังก์ชันแฮชที่แตกต่างกัน (ยิ่งอิสระมากยิ่งดี)
- หากคุณต้องการเพิ่มองค์ประกอบคุณจะคำนวณไฟล์
k
แฮชของค่านี้และตั้งค่าบิตที่เกี่ยวข้องเป็น 1
- หากคุณต้องการตรวจสอบว่ามีองค์ประกอบอยู่หรือไม่คุณจะคำนวณ
k
แฮชทั้งหมดด้วยและหากไม่ได้ตั้งค่าอย่างน้อยหนึ่งรายการแสดงว่าไม่อยู่ในชุด มิฉะนั้นจะอยู่ในชุดได้
แม้แต่คำอธิบายนี้ก็เพียงพอที่จะเข้าใจว่าเหตุใดเราจึงไม่แน่ใจ (คุณสามารถรับบิตทั้งหมดที่กำหนดจากค่าอื่น ๆ ) นี่คือการสร้างภาพที่ดีมากของวิธีการทำงาน
เมื่อไหร่ที่ฟิลเตอร์บานจะมีประโยชน์? คำตอบสั้น ๆ คือทุกที่ที่ยอมรับผลบวกเท็จและคุณต้องการตรวจสอบว่ามีบางสิ่งอยู่ในชุดหรือไม่หรือไม่ แต่ถึงแม้จะไม่ใช่คำตอบก็อาจเป็นด่านแรกในการป้องกันการโทรไปยังผู้ตรวจสอบที่มีราคาแพง
นี่คือรายการคำอธิบายที่เป็นรูปธรรมมากขึ้น:
- มีการอธิบายตัวอย่างมาตรฐานของเว็บไซต์ที่เป็นอันตรายและเบราว์เซอร์ในเกือบทุกที่ที่ผู้คนพูดคุยเกี่ยวกับฟิลเตอร์บาน
- เป็นรหัสผ่านที่อ่อนแอ: แทนที่จะมีชุดรหัสผ่านที่คาดเดายากทั้งหมดที่เป็นไปได้จำนวนมากคุณสามารถตรวจสอบได้ว่ารหัสผ่านนั้นไม่ได้อ่อนแออย่างแน่นอนด้วยตัวกรองบานเล็ก ๆ
- หากคุณมีรายชื่อบทความและรายชื่อผู้ใช้คุณสามารถใช้ตัวกรองบลูมเพื่อแสดงบทความของผู้ใช้ที่พวกเขายังไม่ได้อ่าน สิ่งที่น่าสนใจคือคุณสามารถมีตัวกรองได้เพียงตัวเดียว (คุณตรวจสอบว่ามีการรวม user_id + article_id หรือไม่)
- bitcoin ใช้ตัวกรองบานสำหรับการซิงโครไนซ์กระเป๋าสตางค์
- เว็บเซิร์ฟเวอร์ของ Akamai ใช้ตัวกรอง Bloom เพื่อป้องกันไม่ให้ "one-hit-Wonders" ถูกเก็บไว้ในดิสก์แคช One-hit-Wonders คือเว็บออบเจ็กต์ที่ผู้ใช้ร้องขอเพียงครั้งเดียวสิ่งที่ Akamai พบใช้กับโครงสร้างพื้นฐานการแคชเกือบสามในสี่ของพวกเขา การใช้ตัวกรอง Bloom เพื่อตรวจจับคำขอที่สองสำหรับเว็บอ็อบเจ็กต์และแคชอ็อบเจ็กต์นั้นเฉพาะในคำขอที่สองจะป้องกันไม่ให้สิ่งมหัศจรรย์ที่เกิดขึ้นเพียงครั้งเดียวเข้าสู่แคชของดิสก์ลดภาระงานดิสก์ลงอย่างมากและเพิ่มอัตราการเข้าถึงแคชของดิสก์ (นำมาจากตัวอย่างในตัวกรองของบลูม บทความที่ wiki)