我有許多(2^30乘50位)輸出哈希函數。我需要以某種方式存儲它,並將每個新元素與之前的所有元素進行比較,如果其唯一,則插入。如果我插入新元素時我的散列值數組沒有搞砸,那麼我不需要存儲散列值,它們是順序的。如何有效地存儲和排序生日攻擊哈希
我如何存儲它,然後搜索重複?
至於散列我使用只是 「1」, 「2」, 「3」, 「4」,值.....
EDITED: BA上哈希函數與輸出空間50比特需求接近1.25 * sqrt(2^50)的嘗試。每個輸出50位。所以它有近250 MB的空間。
我有許多(2^30乘50位)輸出哈希函數。我需要以某種方式存儲它,並將每個新元素與之前的所有元素進行比較,如果其唯一,則插入。如果我插入新元素時我的散列值數組沒有搞砸,那麼我不需要存儲散列值,它們是順序的。如何有效地存儲和排序生日攻擊哈希
我如何存儲它,然後搜索重複?
至於散列我使用只是 「1」, 「2」, 「3」, 「4」,值.....
EDITED: BA上哈希函數與輸出空間50比特需求接近1.25 * sqrt(2^50)的嘗試。每個輸出50位。所以它有近250 MB的空間。
不確定您要達到的目標,但可能需要使用bloom filter作爲初步檢查是否存在某個元素以加速此過程。
請注意,當文章中提到「m個不同的哈希函數」時,它的真正含義是,m個不同的函數可以是不同的參數產生不相關結果的相同算法。例如,您可以簡單地將數據預加載爲一個字節值爲0到m-1
的散列值。或者,您可以將SHA256散列的256位碎片分成24位組,或者大到需要過濾器。
#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;
}
'的std :: set'或'的std :: map'合適嗎? – BoBTFish
@BoBTFish,它如何與250 Mb的數據量一起工作。 – Yola