大規模資料處理利器:BloomFilter
#include <stdlib.h>
#include <string.h>
unsigned int jshash(const char *s, unsigned size);
unsigned int sdbmhash(const char *s, unsigned size);
/* ------------- bloom types and funcs --------------- */
const unsigned char masks[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
typedef unsigned
struct __bloom_filter
{
unsigned n;
unsigned size;
unsigned char *bits;
hash_func_ptr hash;
};
typedef struct __bloom_filter* bloom_filter;
bloom_filter bloom_init (unsigned n, hash_func_ptr hash);
int bloom_insert(bloom_filter b, void
int bloom_check(bloom_filter b, void *data, unsigned size);
void bloom_destroy(bloom_filter b);
/* ------------- end of bloom types and funcs --------------- */
int main()
{
const int size = 655371;
bloom_filter b1 = bloom_init(size, sdbmhash);
for (int i = 0; i < size / 2
{
if (!bloom_insert(b1, &i, sizeof(i)))
{
fprintf(stderr, "err insert %d\n", i);
exit(1);
}
}
printf("insert ok\n");
int cnt = 0;
for (int i = 0; i < size / 2; i++)
{
if (bloom_check(b1, &i, sizeof(i)))
{
if (i & 1)
{
//printf("i = %d should not be checked, tolerable.\n", i);
cnt++;
}
}
else
{
if (!(i & 1))
{
printf("i = %d should be checked! BUG!\n", i);
}
}
}
printf("cnt = %d\n", cnt);
return 0;
}
bloom_filter bloom_init (unsigned n, hash_func_ptr hash)
{
bloom_filter b = (bloom_filter)malloc(sizeof(__bloom_filter));
if (b == NULL)
{
fprintf(stderr, "bloom_init: err malloc bloom_filter\n");
return NULL;
}
b->n = n;
b->size = (n + 7) / 8;
b->hash = hash;
b->bits = (unsigned char *)malloc(b->size);
memset(b->bits, 0, b->size);
if (b->bits == NULL)
{
fprintf(stderr, "bloom_init: err malloc bits\n");
return NULL;
}
return b;
}
int bloom_insert(bloom_filter b, void *data, unsigned size)
{
unsigned h = b->hash((const char *)data, size) % (b->n);
unsigned idx = h / 8;
if (idx >= b->size)
{
fprintf(stderr, "bloom_insert: hash value overflow\n");
return 0;
}
b->bits[idx] |= masks[h % 8];
//printf("h = %2d, idx = %2d, bit = %2d\n", h, idx, h % 8);
return 1;
}
int bloom_check(bloom_filter b, void *data, unsigned size)
{
unsigned h = b->hash((const char *)data, size) % (b->n);
unsigned idx = h / 8;
if (idx >= b->size)
{
fprintf(stderr, "bloom_insert: hash value overflow\n");
exit(1);
}
return !!(b->bits[idx] & masks[h % 8]);
}
void bloom_destroy(bloom_filter b)
{
if (b != NULL)
{
if (b->bits != NULL)
free(b->bits);
free(b);
}
}
//-----------------------------------------------
unsigned int jshash(const char *s, unsigned size)
{
int hash = 1315423911;
unsigned len = 0;
while (len < size)
{
hash ^= (hash << 5) + s[len] + (hash >> 2);
len++;
}
return (hash & 0x7fffffffl);
}
unsigned int sdbmhash(const char *s, unsigned size)
{
int hash = 0;
unsigned len = 0;
while (len < size)
{
hash = (hash << 6) + (hash << 16) - hash + s[len];
len++;
}
return (hash & 0x7fffffffl);
}
相關推薦
大規模資料處理利器:BloomFilter
#include <stdio.h>#include <stdlib.h>#include <string.h>unsigned int jshash(const char *s, unsigned size);unsigned int sdbmhash(const ch
BloomFilter——大規模資料處理利器
Bloom Filter是由Bloom在1970年提出的一種多雜湊函式對映的快速查詢演算法。通常應用在一些需要快速判斷某個元素是否屬於集合,但是並不嚴格要求100%正確的場合。 例項 為了說明Bloom Filter存在的重要意義,舉一個例項:
BloomFilter–大規模資料處理利器(解決空查問題)尋找共同的URL
給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4G,讓你找出a、b檔案共同的url? 原文 BloomFilter–大規模資料處理利器 Bloom Filter是由Bloom在1970年提出的一種多雜湊函式對映的快速查詢演算法
那些優雅的資料結構(1) : BloomFilter——大規模資料處理利器
import java.util.BitSet;publicclass BloomFilter {/* BitSet初始分配2^24個bit */privatestaticfinalint DEFAULT_SIZE =1<<25; /* 不同雜湊函式的種子,一般應取質數 */privatesta
ZZ那些優雅的資料結構(1) : BloomFilter——大規模資料處理利器
原文來自:http://www.cnblogs.com/heaad/archive/2011/01/02/1924195.html BloomFilter——大規模資料處理利器 Bloom Filter是由Bloom在1970年提出的一種多雜湊函式對映的快速
BloomFilter–大規模資料處理利器
Bloom Filter是由Bloom在1970年提出的一種多雜湊函式對映的快速查詢演算法。通常應用在一些需要快速判斷某個元素是否屬於集合,但是並不嚴格要求100%正確的場合。 一. 例項 為了說明Bloom Filter存在的重要意義,舉一個例項: 假設要你寫一
bloomfilter大規模資料處理利器
import java.util.BitSet;publicclass BloomFilter {/* BitSet初始分配2^24個bit */privatestaticfinalint DEFAULT_SIZE =1<<25; /* 不同雜湊函式的種子,一般應取質數 */privatesta
python大規模資料處理技巧之一:資料常用操作
面對讀取上G的資料,python不能像做簡單程式碼驗證那樣隨意,必須考慮到相應的程式碼的實現形式將對效率的影響。如下所示,對pandas物件的行計數實現方式不同,執行的效率差別非常大。雖然時間看起來都微不足道,但一旦執行次數達到百萬級別時,其執行時間就根本不可能
吳裕雄 資料探勘與分析案例實戰(4)——python資料處理工具:Pandas
# 匯入模組import pandas as pdimport numpy as np # 構造序列gdp1 = pd.Series([2.8,3.01,8.99,8.59,5.18])print(gdp1)# 取出gdp1中的第一、第四和第五個元素print('行號風格的序列:\n',gdp1[[0,3,
資料量越發龐大怎麼辦?新一代資料處理利器Greenplum來助攻
作者:李樹桓 個推資料研發工程師 前言:近年來,網際網路的快速發展積累了海量大資料,而在這些大資料的處理上,不同技術棧所具備的效能也有所不同,如何快速有效地處理這些龐大的資料倉,成為很多運營者為之苦惱的問題!隨著Greenplum的異軍突起,以往大資料倉庫所面臨的很多問題都得到了有效解決,Greenplu
探索Greenplum的實踐,瞭解新一代大資料處理利器
作者:李樹桓 個推資料研發工程師 前言:近年來,網際網路的快速發展積累了海量大資料,而在這些大資料的處理上,不同技術棧所具備的效能也有所不同,如何快速有效地處理這些龐大的資料倉,成為很多運營者為之苦惱的問題!隨著Greenplum的異軍突起,以往大資料倉庫所面臨
視音訊資料處理入門:PCM音訊取樣資料處理
=====================================================視音訊資料處理入門系列文章:=====================================================上一篇文章記錄了RGB/YUV視訊畫素
Python004-資料處理示例:以某個資料(欄位)為基準從資料中獲取不同的欄位行數
資料來源樣式如下所示: 需求: 讀取文字,以第一列為基準參考系,每個基準僅輸出滿足需要條數的資料;不滿足,全部輸出。 比如,基準為 6236683970000018780,輸出條數要求為 5。若文字中含有 6236683970000018780 多於
[算法系列之十]大資料量處理利器:布隆過濾器
【引言】 在日常生活中,包括在設計計算機軟體時,我們經常要判斷一個元素是否在一個集合中。比如在字處理軟體中,需要檢查一個英語單詞是否拼寫正確(也就是要判斷 它是否在已知的字典中);在 FBI,一個嫌疑人的名字是否已經在嫌疑名單上;在網路爬蟲裡,一個網址是否被訪問過等等。最直
Excel較大規模資料處理例項(可直接用)python實現
問題是這樣的, 我是我們學校的寒招隊伍的負責人。但是管理的人數實在是太多了。所以在這個地方的,我就想用下指令碼去幫助自己進行管理。從效果來看,還是非常方便的。 故事情節: 這次,我和兩三個小夥伴們要一起先舉辦個去全員大會。但是本來會議人員數量
資料處理不等式:Data Processing Inequality
我是在差分隱私下看到的,新解決方案的可用性肯定小於原有解決方案的可用性,也就是說資訊的後續處理只會降低所擁有的資訊量。 那麼如果這麼說的話為什麼還要做特徵工程呢,這是因為該不等式有一個巨大的前提就是資料處理方法無比的強大,比如很多的樣本要分類,我們做特徵提取後,SVM效果很好 ,但是如果用DNN之類
大規模資料處理漫談【2】
上回說到了磁碟的一些特性,感覺不說說檔案不太妥。以及對比檔案系統和raw device的優劣。 在目前的各種檔案系統中,JFS是一種比較適合大規模資料處理的檔案系統,但常用的依然是ext2,ext3. 不同的檔案系統受到特定業務的影響在保持通用的前提下,各有側重
Python空間資料處理2: GDAL柵格影象格式轉換
在《GDAL讀寫遙感影象》中,有提到了GDAL支援多種資料格式,那麼,如何對這些格式進行相互轉換呢? 這其實非常簡單,僅在寫影象時稍加修改即可。例如,當我需要將某種柵格影象轉換為img格式時,只需將《GDAL讀寫遙感影象》中的程式碼進行以下修改: 第42行
大規模資料處理漫談【1】
當然也是我發的了,以後我計劃在這裡以及我的另外一個部落格 繼續該連載,希望廣大網友關注,感興趣的網頁可以轉載,不註明也沒關係,我只是希望推廣大規模資料處理技術,如果能對大家學習工作有所幫助,十分欣慰。 我此前寫過《走進搜尋引擎》,翻譯了《Managing gigabyte
分散式資料處理框架:Apache Beam
1簡介 大資料時代中,資料從簡單的批處理,擴充套件到實時處理、流處理。起初的MapReduce處理模式早已獨木難支。此外,大資料處理技術也是百花齊放,如 HBase、Hive、Kafka、Spark、Flink 等,對開發者而言,想要將其全部熟練運用幾乎是一項不可能完成的任