簡體   English   中英

我在這個布隆過濾器實現中做錯了什么?

[英]what am i doing wrong in this bloom filter implementation?

我有這個位表用於分段布隆過濾器。 這里每列都由一個哈希函數管理。

unsigned char bit_table_[ROWS][COLUMNS];//bit_table now have 8*ROWS*COLUMNS bits
unsigned char bit_mask[bits_per_char] = { 0x01,0x02,0x04,0x08,
                                          0x10,0x20,0x40,0x80};

ROWS個哈希函數,每個哈希函數處理COLUMNS * 8位的設置和檢查。

元素經過哈希處理, bit_indexbit計算為

compute_indices(unsigned int hash)
{
   bit_index=hash%COLUMNS;
   bit=bit_index%8;
}

現在就完成了攝制

for (std::size_t i = 0; i < ROWS; ++i)
      {
        hash=compute_hash(i,set_element);
        compute_indices(hash);
        bit_table_[i][bit_index ] |= bit_mask[bit]; 
      }

而查詢是

for (std::size_t i = 0; i < ROWS; ++i)
      {
     hash=compute_hash(i,set_element);
      compute_indices(hash);

      if (((bit_table_[i][bit_index])& bit_mask[bit]) != bit_mask[bit])
         {
            return false;
         }      
  }

我的問題是布隆過濾器太快就滿了,我懷疑我沒有正確使用字符的各個位。 例如,我想我應該有類似的東西:

bit_table_ [I] [bit_index] [比特] | = BIT_MASK [比特];

插入但是,由於bit_table被聲明為二維數組,我不允許這樣做。

我該怎么做才能利用char數組的各個位?

英語是我的第二語言,所以你可能無法理解我的問題。 如果有要求,我會很樂意解釋我的觀點。

編輯: compute_hash(i,set_elemnt)使用預定義的salt值來計算要插入或查詢的元素的哈希值。

您的compute_indices方法中存在錯誤。

您正在計算列索引,然后在此列索引上應用模8。 最后,您將始終在列中使用相同的位。 例如,對於列10,您將始終使用位2。

你應該有 :

compute_indices(unsigned int hash)
{
    int bitIndex = hash % (COLUMNS * 8);
    bit_index= bitIndex / 8;
    bit = bitIndex % 8;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM