完美哈希,每个唯一字符串

时间:2018-04-16 00:34:59

标签: c++ data-structures tree collision perfect-hash

我有一个包含100万个唯一名称的文本文件。程序读取名称并为每个名称分配一个键。然后将该键和字符串存储在struct对象中以创建树以便更快地搜索。以下是我的散列函数:

while(!myFile.eof())
    {
        key = 0;
        getline(myFile, name);

        for(int i = 0; i < name.length(); i++)
        {
            key = key + name[i];
        }

        insertNode(key, name);
    }

然而,我的Lose-Lose哈希创造了一个可怕的碰撞率: enter image description here 我选择了这种搜索方法,因为我根据键的值对树进行排序,当用户通过数据库搜索名称时,用户将输入一个字符串,然后程序必须将该名称转换为我可以使用的精确哈希键搜索树。问题是由于完美的散列问题,一些节点因为冲突而不得不改变它们的键值,当用户输入字符串时,由于碰撞,我无法知道结构具有什么键。关键改变了。在我的搜索功能中:

    string name;

    cout << "ENTER NAME: ";
    cin >> name;

    int keyForSearch = 0;

    for(int i = 0; i < name.length(); i++)
    {
            keyForSearch = keyForSearch + name[i];
    }

我只是使用相同的散列函数将名称转换为键。我在树上搜索那把钥匙。是否有更好的方法为每个字符串创建一个唯一的哈希,而不是比较密钥是否与数据库的其余部分冲突?还有一种哈希方法,每个唯一名称都有一个没有冲突的唯一键吗?如果没有,搜索树的最佳方式是什么?

0 个答案:

没有答案