布隆过滤器

 1 /*****************************************************
 2 copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd. 
 3 File name:
 4 Author:Jerey_Jobs    Version:0.1    Date: 
 5 Description:
 6 Funcion List: 
 7 *****************************************************/
 8 
 9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <math.h>
12 #include <time.h>
13 
14 #define S_size 10000
15 #define barrel_size 5000
16 #define Hash_count 4
17 
18 int hashvalue(int data,double rand_num)
19 {
20 //    double rand_num;
21     int hash;
22 //    rand_num=(rand()%barrel_size)/(double)barrel_size;
23     hash=(int)(barrel_size*(fmod(rand_num*data,1.0)));
24 
25     return hash;
26 }
27 
28 void creat_randnum(double *hash)
29 {
30     int i;
31     //srand(time(0));
32     for(i=0;i<Hash_count;i++)
33     {
34         *(hash+i)=(rand()%(barrel_size/10))/(double)barrel_size;        
35     }
36 }
37 
38 int main()
39 {
40     int S[S_size];//S集合
41     int barrel[barrel_size]={0};//桶的大小
42     int data;
43     int i=0;
44     int count_estimate=0;//估计值
45     int count_only=0;//query中在S集合中的个数
46     double hash[Hash_count];//hash的值
47     srand((int)time(NULL));
48     FILE *fp=fopen("./stream_for_bm.txt","r");//
49     creat_randnum(hash);
50     if(fp == NULL)//stream_for_bm.txt打开失败
51     {
52         printf("stream_for_bm can't open
'");
53         return 0;
54     }
55 
56     while(!feof(fp))
57     {
58         fscanf(fp,"%d",&data);//存入S集合
59         S[i++]=data;
60         
61         for(int j=0;j<Hash_count;j++)//Hash_count数目个hash函数
62         {
63             barrel[hashvalue(data,hash[j])]=1;//存入桶中
64         }
65     }
66 
67     FILE *fp_query=fopen("./stream_for_query.txt","r");
68     if(fp_query == NULL)
69     {
70         printf("stream_for_query.txt can't open
");
71         return 0;
72     }
73     while(!feof(fp_query))
74     {
75         fscanf(fp_query,"%d",&data);
76         for(int j=0;j<S_size;j++)
77         {
78             if(data == S[j])
79                 count_only++;//精确值
80         }
81         int tmp_count=0;
82         for(int j=0;j<Hash_count;j++)//Hash_count数目个hash函数
83         {
84             if(barrel[hashvalue(data,hash[j])] == 0)
85                 break;
86             else
87                 tmp_count++;
88         }
89         if(tmp_count == Hash_count)
90             count_estimate++;
91     }
92     printf("count_only=%d
count_estimate=%d
",count_only,count_estimate);
93     printf("error rate:%.2lf
",(count_estimate-count_only)/(double)20000);
94     
95     fclose(fp);
96     fclose(fp_query);
97     system("pause");
98     return 0;
99 }
原文地址:https://www.cnblogs.com/SimonKly/p/6838819.html