布隆算法

Bloom filter简介

Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员。如果检测结果为是,该元素不一定在集合中;但如果检测结果为否,该元素一定不在集合中。因此Bloom filter具有100%的召回率。这样每个检测请求返回有“在集合内(可能错误)”和“不在集合内(绝对不在集合内)”两种情况,可见 Bloom filter 是牺牲了正确率和时间以节省空间。

以上文字来源百度百科

Bloom Filter计算方法

如需要判断一个元素是不是在一个集合中,我们通常做法是把所有元素保存下来,然后通过比较知道它是不是在集合内,链表、树都是基于这种思路,当集合内元素个数的变大,我们需要的空间和时间都线性变大,检索速度也越来越慢。 Bloom filter 采用的是哈希函数的方法,将一个元素映射到一个 m 长度的阵列上的一个点,当这个点是 1 时,那么这个元素在集合内,反之则不在集合内。这个方法的缺点就是当检测的元素很多的时候可能有冲突,解决方法就是使用 k 个哈希 函数对应 k 个点,如果所有点都是 1 的话,那么元素在集合内,如果有 0 的话,元素则不在集合内。

Bloom Filter优点缺点

优点

  • 插入时间和查询时间都是常数。
  • 保存的不是数据本身,安全性好。

缺点

  • 插入的元素越多,错判性越大。
  • 不能删除元素。

图示说明

例如我们有一个简单的Bloom Filter结构如下:(所有位都是0)

      [ 0 0 0 0 0 0 0 0 0 0 ]

第一次插入a用两个哈希函数,映射到1 4位置上,变为1.

      [ 1 0 0 1 0 0 0 0 0 0 ]

第二次插入b同样的hash函数,映射到1 8位置上, 变为1.

      [ 1 0 0 1 0 0 0 1 0 0 ]

这样就存放了a b两个元素,当我们查找a是否在的时候,两次hash找到1 4位置,发现同时为 1。则表明a存在。

但是假如我们查找的d哈希后映射到4 8位置,发现也同时为 1. 认为存在,这就出错了,因为现在里面只存放了a b没有d

下面写下我用C++写的代码实现,比较简单的实现了下,具体的Hash算法我都简略的写了。

首先是头文件Header.h

<code class="language-C++ hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="background-color: rgb(255, 255, 255);"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//  Header.h</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//  BloomFilter</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//  Created by Alps on 15/3/19.</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//  Copyright (c) 2015年 chen. All rights reserved.</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#ifndef BloomFilter_Header_h</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#define BloomFilter_Header_h</span>

<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">BitMap</span>{</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>:
    BitMap(){
        bitmap = NULL;
        size = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
    }
    BitMap(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> size){
        bitmap = NULL;
        bitmap = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span>[size];
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (bitmap == NULL) {
            printf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ErroR In BitMap Constractor!\n"</span>);
        }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{
            memset(bitmap, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x0</span>, size * sizeof(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span>));
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>->size = size;
        }
    }

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> initBitMap(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> size){
        bitmap = NULL;
        bitmap = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span>[size];
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (bitmap == NULL) {
            printf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ErroR In BitMap Constractor!\n"</span>);
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
        }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{
            memset(bitmap, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x0</span>, size * sizeof(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span>));
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>->size = size;
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>->size;
        }
    }


    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*
     * set the index bit to 1;
     */</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> bitmapSet(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>){
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> addr = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> addroffset = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>%<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>;
        unsigned <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> temp = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x1</span> << addroffset;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (addr > (size+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)) {
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
        }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{
            bitmap[addr] |= temp;
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;
        }
    }

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*
     * return if the index in bitmap is 1;
     */</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> bitmapGet(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>){
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> addr = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> addroffset = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>%<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>;
        unsigned <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> temp = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x1</span> << addroffset;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (addr > (size + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)) {
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
        }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> (bitmap[addr] & temp) > <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> ? <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> : <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
        }
    }

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*
     * del the index from 1 to 0
     */</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> bitmapDel(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>){
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (bitmapGet(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>) == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
        }
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> addr = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> addroffset = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>%<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>;
        unsigned <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> temp = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x1</span> << addroffset;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (addr > (size + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)) {
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
        }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{
            bitmap[addr] ^= temp;
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;
        }
    }

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span>:
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> *bitmap;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> size;
};

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#endif</span>
</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">14</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">15</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">16</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">17</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">18</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">19</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">20</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">21</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">22</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">23</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">24</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">25</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">26</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">27</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">28</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">29</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">30</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">31</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">32</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">33</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">34</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">35</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">36</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">37</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">38</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">39</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">40</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">41</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">42</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">43</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">44</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">45</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">46</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">47</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">48</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">49</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">50</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">51</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">52</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">53</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">54</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">55</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">56</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">57</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">58</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">59</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">60</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">61</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">62</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">63</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">64</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">65</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">66</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">67</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">68</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">69</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">70</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">71</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">72</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">73</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">74</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">75</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">76</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">77</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">78</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">79</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">80</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">81</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">82</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">83</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">84</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">85</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">86</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">87</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">88</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">89</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">90</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">91</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">92</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">93</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">94</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">95</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">96</span></li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">14</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">15</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">16</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">17</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">18</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">19</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">20</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">21</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">22</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">23</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">24</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">25</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">26</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">27</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">28</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">29</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">30</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">31</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">32</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">33</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">34</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">35</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">36</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">37</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">38</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">39</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">40</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">41</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">42</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">43</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">44</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">45</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">46</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">47</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">48</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">49</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">50</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">51</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">52</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">53</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">54</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">55</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">56</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">57</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">58</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">59</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">60</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">61</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">62</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">63</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">64</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">65</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">66</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">67</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">68</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">69</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">70</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">71</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">72</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">73</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">74</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">75</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">76</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">77</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">78</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">79</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">80</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">81</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">82</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">83</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">84</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">85</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">86</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">87</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">88</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">89</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">90</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">91</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">92</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">93</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">94</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">95</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="background-color: rgb(255, 255, 255);">96</span></li></ul>

头文件保存好,放到工程路径下。 
下面是BloomFilter.cpp文件了。

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="background-color: rgb(255, 255, 255);"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//  main.cpp</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//  BloomFilter</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//  Created by Alps on 15/3/18.</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//  Copyright (c) 2015年 chen. All rights reserved.</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <iostream></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include "Header.h"</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">namespace</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>;


<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">template</span> <<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> Type> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> BloomFilter{
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>:
    BloomFilter();
    BloomFilter(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> length){
        bitmap.initBitMap(length);
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>->length = length;
    }
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> Add(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> Type &T);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> Contains(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> Type &T);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> HasH(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> Type &T);
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span>:
    BitMap bitmap;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> length;
};
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">template</span> <<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> Type> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> BloomFilter<Type>::HasH(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> Type &T){
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> temp = (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>) T;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> temp%length;
}

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">template</span> <<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> Type> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> BloomFilter<Type>::Add(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> Type &T){
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> first = HasH(T);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> second = HasH(first);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (bitmap.bitmapSet(first) && bitmap.bitmapSet(second)) {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>;
    }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>;
    }

}

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">template</span> <<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> Type> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> BloomFilter<Type>::Contains(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> Type &T){
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> first = HasH(T);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> second = HasH(first);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (bitmap.bitmapGet(first) && bitmap.bitmapGet(second)) {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>;
    }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>;
    }
}




<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> argc, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> * argv[]) {

    BloomFilter<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>> bloom(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>);

    bloom.Add(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (bloom.Contains(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)) {
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true\n"</span>);
    }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"false\n"</span>);
    }

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (bloom.Contains(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)) {
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true\n"</span>);
    }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"false\n"</span>);
    }

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
}</span></code>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值