stper** pages;
int tableSize;
struct Person{
string name;
int age;
string homeTown;
};
void fonk1 (int numberOfBuckets)
{
pages = new stper*[numberOfBuckets]();
tableSize = numberOfBuckets;
}
int hashPerson(Person& person)
{
int hashVal = 0;
for (int i=0; i < (person.getName()).length() ; i++)
hashVal = 37*hashVal + (person.getName())[i];
for (int i=0; i < (person.getHomeTown()).length() ; i++)
hashVal = 37*hashVal + (person.getHomeTown())[i];
hashVal+= person.getAge();
hashVal %= tableSize;
if(hashVal < 0)
hashVal += tableSize;
return hashVal;
}
大家好,我是哈希新人。我的哈希函数在hashPerson函数中位于上面,你可以看到有三个键。我的函数是一个很好的散列算法,如何改进函数并减少碰撞次数? (如果有任何语法错误,请忽略)
答案 0 :(得分:1)
我有一些建议:
使用unsigned
代替int
。根据我的经验,这已被证明性能更好,因为当无符号溢出时,它仍然保持非负值(否则%-ing可能导致大问题 - 你得到一个负面索引并且......崩溃)并且它也导致降低碰撞率(经验证明)。此外,在所有函数都应该返回表中的索引之后,这个值很自然地是无符号的 - 索引不能是负数。
在添加年龄时将hashVal乘以某种东西。我会建议一个大于任何可能年龄的值,例如200。
你永远不会说tableSize
是什么,但我会建议你使用一些大的(尽可能大的)素数,再次降低碰撞率。
答案 1 :(得分:1)