2013-01-05 74 views
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函數的上面,你可以看到有三個關鍵字。我的函數是一個很好的哈希算法,我該如何改進函數並減少碰撞次數? (請忽略,如果有任何語法錯誤)如何提高我的哈希算法

+2

到目前爲止,散列函數有什麼問題?你有什麼理由懷疑你需要改變它嗎? – templatetypedef

+0

你的散列函數很好。但是你使用C++,爲什麼不使用stl? –

+0

我只想知道我是否可以改進它,但我不知道它是否是一個好功能。 – peaceman

回答

1

我有幾個建議:

  1. 使用unsigned,而不是int。根據我的經驗,這已被證明表現更好,因爲當無符號溢出時,它仍然保持非負值(否則%-ing可能會導致嚴重問題 - 您會得到一個負面的索引和...崩潰),並且還會導致減少碰撞率(經驗證明)。同樣,在所有函數都應該返回表中的索引之後,這個值是無符號的 - 這個索引不能是負數。

  2. 在添加年齡時乘以hashVal。我會建議一個大於任何可能年齡的值,例如200.

  3. 你從不說什麼是tableSize,但我會建議你使用一些大的(儘可能大)素數,再次降低碰撞率。

1

您可以使用std::hash爲您的基本組件生成良好的散列值。你可以找到一些例子和解釋here

如果您安裝了升壓版本,您可能會發現boost::hash_combine可以滿足您的需求。你可以通過一個很好的示例here找到boost的文檔。