2012-05-17 57 views
0

我有許多(2^30乘50位)輸出哈希函數。我需要以某種方式存儲它,並將每個新元素與之前的所有元素進行比較,如果其唯一,則插入。如果我插入新元素時我的散列值數組沒有搞砸,那麼我不需要存儲散列值,它們是順序的。如何有效地存儲和排序生日攻擊哈希

我如何存儲它,然後搜索重複?

至於散列我使用只是 「1」, 「2」, 「3」, 「4」,值.....

EDITED: BA上哈希函數與輸出空間50比特需求接近1.25 * sqrt(2^50)的嘗試。每個輸出50位。所以它有近250 MB的空間。

+2

'的std :: set'或'的std :: map'合適嗎? – BoBTFish

+0

@BoBTFish,它如何與250 Mb的數據量一起工作。 – Yola

回答

0

不確定您要達到的目標,但可能需要使用bloom filter作爲初步檢查是否存在某個元素以加速此過程。

請注意,當文章中提到「m個不同的哈希函數」時,它的真正含義是,m個不同的函數可以是不同的參數產生不相關結果的相同算法。例如,您可以簡單地將數據預加載爲一個字節值爲0到m-1的散列值。或者,您可以將SHA256散列的256位碎片分成24位組,或者大到需要過濾器。

0

Using一個std::map

#include <string> 
#include <map> 
#include <sstream> 
#include <algorithm> 
#include <iterator> 

using namespace std; 

string toString(long value) 
{ 
    ostringstream oss; 
    oss << value; 
    return oss.str(); 
} 

long hash(const string& key) 
{ 
    return 0; 
} 

string generateKey() 
{ 
    static long value = 0; 
    ++value; 
    return toString(value); 
} 

pair<string, long> generateKeyValuePair() 
{ 
    string key = generateKey(); 
    return make_pair(key, hash(key)); 
} 

主要功能:

int main() 
{ 
    map<string, long> hashes; 

    generate_n(inserter(hashes, hashes.begin()), 5, generateKeyValuePair); 

    return 0; 
}