我正在用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;
}
它曾經做的工作就好了,是非常快。然而,現在的計算器擴展越來越多,而且用戶可以自己定義的函數和變量,碰撞變得相當明顯 - 例如cond
和dotp
兩個散列612
可能有人建議快速和簡單,並作爲非碰撞儘可能散列函數來替換我現在使用的一個? 此外,函數的表格並非完全硬編碼,散列函數也可用於散列用戶定義函數的名稱,對此,使用了檢查匹配的不同方式,但我使用的散列函數是一樣的。
在此先感謝。
可能的重複[你將如何去設計一個完美的散列函數?](http://stackoverflow.com/questions/734754/how-would-you-go-about-designing-a-function- for-a-perfect-hash) – kennytm 2010-08-16 12:01:50
該鏈接中的海報對散列函數感興趣,以散列固定表,但在我的情況下,可能會有用戶添加的新函數,因此表不完全是靜態的這些,使用了不同的機制,開關是用於硬編碼的)。編輯帖子澄清這一點。 – houbysoft 2010-08-16 12:06:51
沒有像非碰撞散列函數那樣的東西。也許你的意思是映射函數。 – codymanix 2010-08-16 12:09:06