我有很多(2 ^ 30乘50位)哈希函数的输出。我需要以某种方式存储它并将每个新元素与之前的所有元素进行比较,并插入它的唯一性。如果我插入新元素时我的哈希值数组没有搞乱,那么我不需要存储哈希值,它们是顺序的。
我如何存储它然后搜索两面性?
作为哈希值,我只使用“1”,“2”,“3”,“4”,.....
EDITED: 具有输出空间50位的散列函数的BA需要接近1.25 * sqrt(2 ^ 50)次尝试。每输出50位。所以它有近250兆字节的空间。
答案 0 :(得分:0)
不确定您要实现的目标,但也许您需要使用bloom filter作为元素存在的初步检查,以加快流程。
请注意,当文章说“m个不同的散列函数”时,它的真正含义是,m个不同的函数可以是相同的算法,具有产生不相关结果的不同参数。例如,您可以简单地将要散列的数据添加到值为0到m-1
的字节。或者你可以将SHA256哈希值的256位切换成24位组,或者你需要过滤器这么大。
答案 1 :(得分:0)
#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;
}