国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

布隆過濾器簡介

shuibo / 372人閱讀

摘要:布隆過濾器可以用于檢索一個元素是否在一個集合中。舉個栗子,比如第一次將存入布隆過濾器,將數組的,位置置為了,只要下次再有存入布隆過濾器,發現已經是全是了,所以可知該字符串已經保存過。

????最近做爬蟲項目過濾重復的url的時候,了解到一個東西,叫布隆過濾器,然后也學習了一下,寫下這篇博客記錄一下.
下面我們將分為幾個專題來介紹布隆過濾器:
1.什么是布隆過濾器;
2.布隆過濾器的使用場景和缺陷;
3.布隆過濾器java實現;
4.guava中使用布隆過濾器;
5.布隆過濾器的變體

1.什么是布隆過濾器?

????首先我們得知道布隆過濾器的概念是什么,采自wiki百科:
布隆過濾器(英語:Bloom Filter)是1970年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數。布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的算法,缺點是有一定的誤識別率和刪除困難。
tips:看完這個我們可以知道是一個叫布隆的人提出的一個用來檢索一個元素是否在一個集合中的算法,效率高,性能好。

1.1 圖解布隆過濾器

很長的二進制向量(這里可以理解為很長的bit數組)

一系列的隨機映射函數(hash函數)

????如圖所示,將一個字符串存入布隆過濾器的時候,這個字符串會先被多個hash函數生成不同的hash值,然后在對應的bit數組的位置,將0置為1(bit數組初始化的時候,全部位置都是0);然后第二次在有相同的字符串存入的時候,因為之前已經對應的位置都被置為1了,所以可以很輕松的知道這個值已經存在了。
????舉個栗子,比如第一次將abc@gmail.com存入布隆過濾器,將bit數組的1,3,5位置置為了1,只要下次再有abc@gmail.com存入布隆過濾器,發現1,3,5已經是全是1了,所以可知該字符串已經保存過。(簡單來說就是bit數組中對應的值只要全是1就存在,其他情況就是不存在,但是因為存在hash沖突,所以會有誤判,有可能存在abc和xyz的hash值在bit數組中映射的位置是相同的。這種情況我們可以增加班名單,或者調整hash函數來減少誤判情況。)

2.布隆過濾器的使用場景

知道了布隆過濾器的概念,我們再來看看在實際工作中,它主要使用在哪些地方。

2.1使用場景:

1.網絡爬蟲可以通過布隆過濾器判斷當前的url是否已經爬取過;

2.防止惡意鏈接或者垃圾郵件,短信之類的,從數十億個鏈接或者垃圾郵件中判斷該鏈接(郵件發件人,短信發信人是否是在黑名單中),
平時手機上來電提示寫著對方式惡意推銷,外賣,這種場景也是可以用布隆過濾器來判斷;

3.防止緩存擊穿,將已存在的緩存放到布隆中,當使用緩存的時候,可以先訪問布隆過濾器,存在則訪問緩存,不存在則訪問數據庫;

4.檢索系統查詢當前的輸入信息是否存在于數據庫中,也可以使用布隆過濾器。

3.布隆過濾器java實現
public class BloomFilter {


    /**
     * bitSet的大小
     */
    private static final int DEFAULT_SIZE = 2 << 24;
    /**
     * 選取的hash函數
     */
    private static final int[] SEEDS = new int[]{3, 13, 46, 71, 91, 134};

    /**
     * bitSet每一位只能是true或false  其實就是bit數組說的0或者1
     */
    private BitSet bits = new BitSet(DEFAULT_SIZE);
    private SimpleHash[] func = new SimpleHash[SEEDS.length];

    public static void main(String[] args) {
        String value = "wxwwt@gmail.com";
        BloomFilter filter = new BloomFilter();
        System.out.println(filter.contains(value));
        filter.add(value);
        System.out.println(filter.contains(value));
    }

    public BloomFilter() {
        for (int i = 0; i < SEEDS.length; i++) {
            func[i] = new SimpleHash(DEFAULT_SIZE, SEEDS[i]);
        }
    }

    public void add(String value) {
        for (SimpleHash f : func) {
            bits.set(f.hash(value), true);
        }
    }

    public boolean contains(String value) {
        if (value == null) {
            return false;
        }
        boolean ret = true;
        for (SimpleHash f : func) {
            ret = ret && bits.get(f.hash(value));
        }
        return ret;
    }

    public static class SimpleHash {

        private int cap;
        private int seed;

        public SimpleHash(int cap, int seed) {
            this.cap = cap;
            this.seed = seed;
        }

        /**
         * 計算hash值
         *
         * @param value
         * @return
         */

        public int hash(String value) {
            int result = 0;
            int len = value.length();
            for (int i = 0; i < len; i++) {
                result = seed * result + value.charAt(i);
            }
            return (cap - 1) & result;
        }

    }
}
4.使用guava帶的布隆過濾器

google的java工具包中已經編寫了布隆過濾器的代碼,可以直接拿來用,具體使用可以google一下,這里只簡單的提一下:

public static void main(String[] args) {
      // 創建布隆過濾器
      BloomFilter bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), 1000);

      // 添加數據
      for (int index = 0; index < 100000; index++) {
          bloomFilter.put("wxwwt-" + index);
      }

      //  查看數據是否存在
      if (bloomFilter.mightContain("wxwwt-" + 9999)) {
          System.out.println("存在");
      }
      // 誤判元素
      if (bloomFilter.mightContain("不存在的元素")) {
          System.out.println("誤判啦");
      } else {
          System.out.println("不存在");
      }
  }

運行結果:

5.總結:

在數據量很大的時候使用布隆過濾器非常方便,占用的內存空間很小(因為使用的是bit數組,空間使用非常小,空間開銷就是bit數組的大?。樵冃室埠芨撸ㄖ苯油ㄟ^計算hash函數的出來的),唯一的問題就是可能會有誤判,不過概率也是比較小的,也可以通過增加白名單和增加hash函數的數量來減少這個問題的產生,總的來說利大于弊,在僅判斷元素是否存在而不涉及到刪除的情況下非常好用(最基本的bloomfilter是無法刪除元素的,置為0就沒法判斷存在情況了,有bloom過濾器的變體是支持刪除的)。

參考資料:

1.https://nick-weixx.github.io/...
2.https://zh.wikipedia.org/wiki...
3.https://zhangluncong.com/2018...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74546.html

相關文章

  • 大白話布隆濾器

    摘要:可以看出,僅僅從布隆過濾器本身而言,根本沒有存放完整的數據,只是運用一系列隨機映射函數計算出位置,然后填充二進制向量。也就是說布隆過濾器只能判斷數據是否一定不存在,而無法判斷數據是否一定存在。我向布隆過濾器插入了,然后用來測試誤判率。本文是站在小白的角度去討論布隆過濾器,如果你是科班出身,或者比較聰明,又或者真正想完全搞懂布隆過濾器的可以移步。 不知道從什么時候開始,本來默默無聞的布隆過濾器...

    meteor199 評論0 收藏0
  • 布隆濾器的Python實現(標準、計數、標準擴容、計數擴容)

    摘要:布隆過濾器的實現,包括標準計數標準擴容計數擴容。計數擴容布隆過濾器標準擴容布隆過濾器的子類,功能繼承自標準擴容布隆過濾器,但支持刪除元素的操作。 bloompy github:bloompy 布隆過濾器的Python3實現,包括標準、計數、標準擴容、計數擴容。更新自pybloom。 安裝 pip install bloompy 使用 通過bloompy你可以使用四種布隆過濾器 標準布...

    Pocher 評論0 收藏0
  • 說一說布隆濾器

    摘要:介紹布隆過濾器在上的介紹布隆過濾器是年由布隆提出的。通過介紹已經知曉布隆過濾器的作用是檢索一個元素是否在集合中。控制布隆過濾器的誤判率如果集合的大小相比于輸入對象的個數過小,失誤率就會變高。 介紹 布隆過濾器在wiki上的介紹: 布隆過濾器(Bloom Filter)是1970年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數。布隆過濾器可以用于檢索一個元素是否在一個集...

    terasum 評論0 收藏0

發表評論

0條評論

shuibo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<