我有一个包含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哈希创造了一个可怕的碰撞率: 我选择了这种搜索方法,因为我根据键的值对树进行排序,当用户通过数据库搜索名称时,用户将输入一个字符串,然后程序必须将该名称转换为我可以使用的精确哈希键搜索树。问题是由于完美的散列问题,一些节点因为冲突而不得不改变它们的键值,当用户输入字符串时,由于碰撞,我无法知道结构具有什么键。关键改变了。在我的搜索功能中:
string name;
cout << "ENTER NAME: ";
cin >> name;
int keyForSearch = 0;
for(int i = 0; i < name.length(); i++)
{
keyForSearch = keyForSearch + name[i];
}
我只是使用相同的散列函数将名称转换为键。我在树上搜索那把钥匙。是否有更好的方法为每个字符串创建一个唯一的哈希,而不是比较密钥是否与数据库的其余部分冲突?还有一种哈希方法,每个唯一名称都有一个没有冲突的唯一键吗?如果没有,搜索树的最佳方式是什么?