2014-11-05 57 views
0

這個散列函數有什麼問題?具體來說,當N = 127被傳入時會發生什麼?這個散列有什麼問題?

int hash3(char *k, int N) 
{ 
    char *c; int h = 0; 

    for (c = k; *c != '\0'; c++) { 
     h = h | *c; 
    } 
    return (h % N); 
} 

這是一個在實踐考試中出現的問題(不幸的是,沒有解決方案)。據我瞭解,該函數使用按位或將字符串轉換爲整數,並將其放在一個大小爲N的表格中,但我不知道爲什麼它會出錯。提前致謝。

+0

嘗試輸入一些長句子,看看會返回什麼。 – ymonad 2014-11-05 02:39:43

回答

0

單調函數如按位或不適合計算散列。

如您所知,OR運算符「|」工作如下。

0 | 0 = 0

0 | 1 = 1

1 | 0 = 1

1 | 1 = 1

1的數量從未降低,所以OR操作是單調的增量函數。

如果對多個數據反覆應用OR操作,結果可能變爲'1'。

如果將長字符序列應用到代碼中,則可能會有127(二進制中的「1111111」)作爲頻繁或幾乎時間的結果。

按位AND也不合適,因爲AND是單調遞減函數。

XOR是計算哈希的最合適的按位運算。

+0

啊!這就說得通了!謝謝。 – Chris 2014-11-05 03:09:21