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

4

2 回答 2

1

我有几个建议:

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

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

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

于 2013-01-05T21:25:09.013 回答
1

您可以使用std::hash为您的基本组件生成良好的哈希值。您可以在此处找到一些示例和说明。

如果您安装了 boost 版本,您可能会发现它boost::hash_combine可以满足您的需要。您可以在此处找到带有良好示例的 boost 文档。

于 2013-01-05T23:06:27.767 回答