1. 程式人生 > >大規模資料處理利器:BloomFilter

大規模資料處理利器:BloomFilter

#include <stdio.h>
#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
 (*hash_func_ptr)(const char *buffer, unsigned size);
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
 *data, unsigned size);
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
; i += 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 等,對開發者而言,想要將其全部熟練運用幾乎是一項不可能完成的任