2010-08-16 61 views
3

我正在用C語言編寫高級計算器。正如您猜測的那樣,它目前有許多功能,並且我使用開關爲每個函數執行正確的操作名稱。它是這樣的:(幾乎)在開關中使用的非碰撞簡單散列函數

switch(hash_of(function_name_currently_being_parsed)) 
{ 
    case HASH_COS: 
    // do something 
    break; 

    case HASH_SIN: 
    // do something else 
    break; 

    // etc. 
} 

到現在爲止,我用這個簡單的功能,我發現某處在互聯網上做的哈希:

#define NHASH 29989 
#define MULT 31 

unsigned int simple_hash(char *p) 
{ 
    unsigned int h = 0; 
    for(; *p; p++) 
    h = MULT * h + tolower(*p); 
    return h % NHASH; 
} 

它曾經做的工作​​就好了,是非常快。然而,現在的計算器擴展越來越多,而且用戶可以自己定義的函數和變量,碰撞變得相當明顯 - 例如conddotp兩個散列612

可能有人建議快速簡單,並作爲非碰撞儘可能散列函數來替換我現在使用的一個? 此外,函數的表格並非完全硬編碼,散列函數也可用於散列用戶定義函數的名稱,對此,使用了檢查匹配的不同方式,但我使用的散列函數是一樣的。

在此先感謝。

+0

可能的重複[你將如何去設計一個完美的散列函數?](http://stackoverflow.com/questions/734754/how-would-you-go-about-designing-a-function- for-a-perfect-hash) – kennytm 2010-08-16 12:01:50

+0

該鏈接中的海報對散列函數感興趣,以散列固定表,但在我的情況下,可能會有用戶添加的新函數,因此表不完全是靜態的這些,使用了不同的機制,開關是用於硬編碼的)。編輯帖子澄清這一點。 – houbysoft 2010-08-16 12:06:51

+0

沒有像非碰撞散列函數那樣的東西。也許你的意思是映射函數。 – codymanix 2010-08-16 12:09:06

回答

3

如果你想找的散列函數,看看這兩個Paul Hseih' PageBob Jenkins' Page(這個人是金)的散列,雖然就個人而言我一般用Murmur2的哈希(有一些不同的種子),用正確的種子,你贏了使用一個64位版本(我還沒有測試過16位),使用一個32位輸出或者甚至更少(基本上沒有,除非你故意顛覆哈希),你會得到很多(如果有衝突的話)。

至於你的問題,如果你使用某種形式的二叉搜索樹的查找功能,看到有用戶定義函數(特里樹甚至可能工作)

0

你可以使用樹木查找可能更容易。他們沒有碰撞。