布隆過濾器的原理、應用場景和源碼分析實現

原理

布隆過濾器數據結構
布隆過濾器是一個 bit 向量或者說 bit 數組,長這樣:
在這里插入圖片描述
如果我們要映射一個值到布隆過濾器中,我們需要使用多個不同的哈希函數生成多個哈希值,并對每個生成的哈希值指向的 bit 位置 1。
例如針對值 “baidu” 和三個不同的哈希函數分別生成了哈希值 1、4、7,則上圖轉變為:
在這里插入圖片描述
Ok,我們現在再存一個值 “tencent”,如果哈希函數返回 3、4、8 的話,圖繼續變為:
在這里插入圖片描述
值得注意的是,4 這個 bit 位由于兩個值的哈希函數都返回了這個 bit 位,因此它被覆蓋了。

現在我們如果想查詢 “dianping” 這個值是否存在,哈希函數返回了 1、5、8三個值,結果我們發現 5 這個 bit 位上的值為 0,說明沒有任何一個值映射到這個 bit 位上,因此我們可以很確定地說 “dianping” 這個值不存在。

而當我們需要查詢 “baidu” 這個值是否存在的話,那么哈希函數必然會返回 1、4、7,然后我們檢查發現這三個 bit 位上的值均為 1,那么我們可以說 “baidu” 存在了么?答案是不可以,只能是 “baidu” 這個值可能存在。

這是為什么呢?答案跟簡單,因為隨著增加的值越來越多,被置為 1 的 bit 位也會越來越多,這樣某個值 “taobao” 即使沒有被存儲過,但是萬一哈希函數返回的三個 bit 位都被其他值置位了 1 ,那么程序還是會判斷 “taobao” 這個值存在。

作者:YoungChen__
鏈接:https://zhuanlan.zhihu.com/p/43263751

特點

  • 可以判斷某一個數一定不存在
  • 不可以判斷某一個數一定存在

應用場景

  • 海量URL的去重

源碼實現

  • 三個哈希函數
unsigned int SDBMHash(char *str, unsigned int size)
{unsigned int hash = 0;while (*str){// equivalent to: hash = 65599*hash + (*str++);hash = (*str++) + (hash << 6) + (hash << 16) - hash;}return (hash & 0x7FFFFFFF) % size;
}// RS Hash Function
unsigned int RSHash(char *str, unsigned int size)
{unsigned int b = 378551;unsigned int a = 63689;unsigned int hash = 0;while (*str){hash = hash * a + (*str++);a *= b;}return (hash & 0x7FFFFFFF) % size;
}// JS Hash Function
unsigned int JSHash(char *str, unsigned int size)
{unsigned int hash = 1315423911;while (*str){hash ^= ((hash << 5) + (*str++) + (hash >> 2));}return (hash & 0x7FFFFFFF) % size;
}
  • 插入并給指定位置置1
void BFInsert(BloomFilter *pBF, const char *str)
{unsigned int i1 = pBF->func1(str, pBF->bm.size);unsigned int i2 = pBF->func2(str, pBF->bm.size);unsigned int i3 = pBF->func3(str, pBF->bm.size);BMSetOne(&(pBF->bm), i1);BMSetOne(&(pBF->bm), i2);BMSetOne(&(pBF->bm), i3);
}

優質參考文獻

https://www.jianshu.com/p/2104d11ee0a2

https://blog.csdn.net/championhengyi/article/details/72885500

https://baike.baidu.com/item/布隆過濾器/5384697?fr=aladdin

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382404.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382404.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382404.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

判斷一個數字是否存在于某一個數據之中

哈希表 這個沒啥說的&#xff0c;后面補充 位圖 https://blog.csdn.net/csdn_kou/article/details/95337121 布隆過濾器 哈希表位圖 https://blog.csdn.net/csdn_kou/article/details/95371085

根據語句自動生成正則表達式

自動生成 http://www.txt2re.com 速查手冊 https://www.jb51.net/shouce/jquery/regexp.html

免密登錄堡壘機和服務器

免密登錄堡壘機 安裝oathtool和sshpass 這兩個文件安裝比較耗費時間&#xff01; brew install oath-toolkit brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb免密登錄堡壘機 書寫shell腳本 #!/usr/bin/env bash …

mysql建表sql

mysql建表 文章目錄mysql建表mysql學生表插入數據建表&#xff0c;學生和idgroup byinner joinmysql學生表 CREATE TABLE courses ( id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 自增id, student VARCHAR(255) DEFAULT NULL COMMENT 學生, class VARCHAR(255) DEFAU…

Effective C++學習第一天

1&#xff1a;區分C中的術語聲明、定義、初始化的概念聲明&#xff08;declaration&#xff09;&#xff1a;告訴編譯器某個東西的名稱和類型&#xff0c;但略去其他細節&#xff08;可以出現多次&#xff0c;編譯器不分配內存&#xff09;。定義&#xff08;definition&#x…

Redis運維和開發學習筆記(1) Redis簡介

文章目錄Redis的特性速度快持久化多種數據結構主從復制高可用和分布式典型的應用場景Redis啟動和可執行文件Redis可執行文件說明啟動方式驗證redisredis常用配置redis數據結構和內部編碼Redis是單線程&#xff0c;不會同時執行兩條命令哈希慢查詢pipelineRedis的特性 速度快 …

Effective C++學習第二天

1&#xff1a;確保對象被使用前已先被初始化&#xff0c;讀取未初始化的值會造成不明確的行為&#xff0c;可能導致程序終止運行或者其他不可預期的現象&#xff1b;在C中&#xff0c;當你使用C part of C(C中C語言部分的內容&#xff09;且初始化可能導致運行期成本&#xff0…

Redis運維和開發學習筆記(3)redis搭建集群

Redis運維和開發學習筆記(3)redis搭建集群 文章目錄Redis運維和開發學習筆記(3)redis搭建集群Redis集群搭建Redis集群搭建 cp /etc/redis.d/redistest_7001.conf /etc/redis.d/redistest_XXXX.conf :%s/7001/xxxx/g 配置文件內容&#xff1a;cluster-enabled yes ############…

Effective C++學習第三天

1&#xff1a;為多態基類聲明virtual析構函數當我們創建一個base class指針指向新生成的derived class時&#xff0c;當刪除基類指針時&#xff0c;如果base class是一個non-virtual析構函數時&#xff0c;實際執行的結果通常是derived class中的base成分被銷毀&#xff0c;der…

linux創建指定大小的文件

一、生成文件大小和實際占空間大小一樣的文件 dd if/dev/zero ofname.file bs1M count1 文件名稱name.file bs1M表示每一次讀寫1M數據&#xff0c;count50表示讀寫 50次&#xff0c;這樣就指定了生成文件的大小為50M。 二、生成文件大小固定&#xff0c;但實際不占空間命令 …

Effective C++學習第四天

條款11&#xff1a;在operator中處理自我賦值的現象雖然我們在平時可能不會出現顯示自我賦值的現象&#xff0c;當加入指針或者引用時&#xff0c;可能會出現不同的指針或引用指向同一對象&#xff08;對象的不同別名&#xff09;&#xff0c;這時候我們就得考慮對象是否是同一…

Effective C++學習第五天

條款14&#xff1a;在資源管理類中小心copy行為當我們深入理解“資源取得時機是初始化時機&#xff08;RAII&#xff09;”概念&#xff0c;并以此作為“資源管理類”的核心時&#xff0c;我們可能會遇到將RAII對象復制的情況&#xff0c;一般有兩種情況處理這個現象&#xff1…

Redis運維和開發學習筆記(2) redis持久化

Redis運維和開發學習筆記(2) redis持久化 文章目錄Redis運維和開發學習筆記(2) redis持久化持久化持久化方式一:RDB觸發~~的三種~~方式1. save命令2. bgsave配置觸發機制RDB 總結持久化方式二:AOFAOF的三種策略三種策略的優缺點AOF重寫機制持久化 redis將所有數據保存在內存中&…

Effective C++學習第六天

條款18&#xff1a;讓接口更容易被正確使用&#xff0c;不易被誤用設計接口的原則&#xff1a;正確性、高效性、封裝性、維護性、延展性以及協議的一致性&#xff1b;設計原則&#xff1a;1&#xff09;導入新類型來預防很多客戶端的錯誤&#xff0c;多使用系統類型&#xff08…

Redis運維和開發學習筆記(4) Redis參數意義

Redis運維和開發學習筆記(4) Redis參數意義 文章目錄Redis運維和開發學習筆記(4) Redis參數意義參數意義參數意義 Client連接 問題 id567800790 addr10.18.17.217:37310 fd1572 name age2039114 idle2034860 flagsN db0 sub0 psub0 multi-1 qbuf0 qbuf-free0 obl0 oll0 omem0 …

Effective C++學習第七天

條款23&#xff1a;寧以non-memeber、non-friend替換member函數non-member/non-friend可以給對象帶來更大的封裝性&#xff0c;從兩個方面來考慮&#xff1a;1&#xff09;考慮封裝&#xff0c;越多東西被封裝&#xff0c;它們就越不可見&#xff0c;就越少人看到它&#xff0c…

Redis運維和開發學習筆記(5) 主從復制和sentinel哨兵模式

Redis運維和開發學習筆記(5) 主從復制和sentinel哨兵模式 主從復制 將主節點的數據改變同步給從節點 作用 備份數據讀寫分離 存在的問題&#xff1a; 手動干預切主等操作主節點的寫能力受到單機限制主節點的存儲能力受到單機限制 主從模式的故障恢復 當主節點發生故障時&am…

Effective C++學習第八天

條款26&#xff1a;盡可能延后變量定義式的出現時間當你定義了一個變量&#xff0c;如果在使用變量之前出現異常&#xff0c;那么你得承受一次構造成本和析構成本&#xff0c;而且你沒有使用該變量&#xff1b;本條款給出的建議是延遲變量的定義&#xff0c;直到非得使用該變量…

Redis運維和開發學習筆記(6) 監控Redis工作狀態-info命令

Redis運維和開發學習筆記(6) 監控Redis工作狀態-info命令 文章目錄Redis運維和開發學習筆記(6) 監控Redis工作狀態-info命令info serverinfo clientinfo memoryinfo persistenceinfo statsinfo commandstatsinfo cpuinfo clusterinfo keyspaceinfo server Redis服務器相關的通用…

Effective C++學習第九天

條款32&#xff1a;確定你的public繼承塑模出is-a模型class D&#xff08;derived&#xff09;以public形式繼承class B&#xff08;base&#xff09;&#xff0c;則每一個類型為D的對象同時也是一個類型為B的對象&#xff0c;反之不成立&#xff0c;因此B比D表現出更加一般化的…