cmph最小完美哈希

时间:2017-01-04 00:45:43

标签: hash perfect-hash universal-hashing

我花了几天时间试图让图书馆在我的系统上运行。 该库有几种生成MPHF的算法。 我对最小散列函数的理解是,当我使用MPHF散列两个不同的键时,它们将返回两个不同的id。 对于我生成的200万个密钥(整数,通过算法读取为字符串),情况似乎并非如此。我已经尝试了一些库实现的算法,但是所有这些算法都会导致很多键出现重复的'ids'。

这是我写的:

#include <cmph.h>
#include <iostream>
#include <fstream>
#include <bitset>
#include <string>
#include <sstream>
#include <limits.h>

using namespace std;

int main(int argc, char** argv){

    FILE *fp = fopen("keys.txt", "r");
    FILE *read = fopen("keys2.txt", "r");
    ofstream ids("ids2.txt");

    if(!fp || !read || !ids.is_open()){
    cerr<<"Failed to open the file\n";
    exit(1);
    }

    cmph_t* hash = NULL;
    // source of keys
    cmph_io_adapter_t *source = cmph_io_nlfile_adapter(fp);
    cmph_config_t *config = cmph_config_new(source);
    cmph_config_set_algo(config, CMPH_BDZ);
    hash = cmph_new(config);
    cmph_config_destroy(config);

    char *k = (char *)malloc(sizeof(12));

    while(fgets(k, INT_MAX, read) != NULL){
    string key = k;
    unsigned int id = cmph_search(hash, k, (cmph_uint32)key.length());
    ids<<id<<"\n";
    }

    cmph_destroy(hash);
    cmph_io_nlfile_adapter_destroy(source);
    fclose(fp);
    fclose(read);
    ids.close();
}

如果算法声称生成最小完美散列函数,那么每个不同的密钥都不应该是唯一的吗?钥匙有2048383个。对于我的项目,我需要将id从0映射到2048382,因为我打算使用最小的完美散列函数。 我不确定我的理解在哪里出错了。 请帮忙。

1 个答案:

答案 0 :(得分:0)

如果您的clang -lcs50 sum.c -o sum包含的密钥不是用于生成keys2.txt的密钥的一部分,那么根据mphf的定义,您将得到重复的哈希,或者可能会得到,值超出了您的范围。存储所有用于生成hash的密钥,然后验证传递给hash的密钥是否与cmph_search <返回的哈希/ id的密钥相同,由您决定/ p>