如何改进我的哈希算法

时间:2013-01-05 20:26:16

标签: c++ algorithm hash

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函数中位于上面,你可以看到有三个键。我的函数是一个很好的散列算法,如何改进函数并减少碰撞次数? (如果有任何语法错误,请忽略)

2 个答案:

答案 0 :(得分:1)

我有一些建议:

  1. 使用unsigned代替int。根据我的经验,这已被证明性能更好,因为当无符号溢出时,它仍然保持非负值(否则%-ing可能导致大问题 - 你得到一个负面索引并且......崩溃)并且它也导致降低碰撞率(经验证明)。此外,在所有函数都应该返回表中的索引之后,这个值很自然地是无符号的 - 索引不能是负数。

  2. 在添加年龄时将hashVal乘以某种东西。我会建议一个大于任何可能年龄的值,例如200。

  3. 你永远不会说tableSize是什么,但我会建议你使用一些大的(尽可能大的)素数,再次降低碰撞率。

答案 1 :(得分:1)

您可以使用std::hash为基本组件生成良好的哈希值。您可以找到一些示例和解释here

如果您安装了版本的boost,您可能会发现boost::hash_combine可以满足您的需求。你可以通过一个好的样本here找到boost的文档。