2009-10-01 69 views
0

我試過了一切。即使是Java的forumla:獲取合適的哈希索引C++

java.lang.String.hashCode():

s[0]*(31^(n-1)) + s[1]*(31^(n-2)) + ... + s[n-1] 

我interpretted這是一筆: 雖然我不太清楚如何處理就做[N- 1];

int hashmap::hashstr(const char*const str) 
{ 
    int result = 0; 
    int i = 0; 
    int j = 0; 
    int k = 0; 
    unsigned n = 0; 
    for (; str[n] != NULL; ++n); // how many characters? 

    while (j != n) // no more characters 
    { 
     result += str[i] * (31^(n - k)); 
     j++; 
     i++; 
     k++; 
    } 
    return result % maxSize; 
} 

其中最大範圍是在11

什麼我做錯了我的固定陣列尺寸10號元素?我的一些散列標記出錯了。其他人,正確。爲什麼是這樣?到目前爲止,每個人都喜歡,「誰在乎它是如何工作的!使用模板!」好吧,我想了解這個..

+2

我想你需要學習一些更基本的東西,例如在嘗試hashmaps之前使用strlen()。 – 2009-10-01 06:20:07

+0

當你說索引是「錯誤的」或「正確的」時,你能解釋一下嗎?任何散列函數都適用,但有些效率不高。沒有「錯誤」或「正確」。你在比較你的實現與Java? – user172818 2009-10-01 19:38:26

回答

3
unsigned n = 0; 
for (; str[n] != NULL; ++n); // how many characters? 

你知道你可以只使用strlen(str),對不對?

而行:

return result % maxSize; 

從哪兒是這個result?我沒有看到任何result變量。

+0

有人告訴我,在循環中使用strlen(str)是不好的編程實踐b/c的編程。 – user40120 2009-10-01 06:41:34

+1

@lampshade,你在說什麼?你不要把strlen()放在循環中。你會發現字符串的大小,它與你的循環無關。 – mmcdole 2009-10-01 06:46:24

+2

這是一個不好的做法,使用strlen(),你實際上遍歷字符串,因爲strlen()函數本身首先遍歷字符串。也許在這種情況下它並不是那麼重要,但是在任何你實際通過字符串的代碼中,通常更好的做法是隻用'\ 0'來測試當前字符以找出結果。這是ASCIIZ字符串處理的一個縮略規則。 – progician 2009-10-01 09:31:50

7
s[0](31^(n-1)) + s[1](31^(n-2)) + ... + s[n-1] 

在式^表示取冪,而不是按位xor操作。
退房this SO問題。

0

從這個代碼只是去,你可以做到以下幾點:

void function (const char *str) 
{ 
    while (*str) 
    { 
     /* process whatever with *str which is the same as str[i] in a for loop */ 
     str++; 
    } 
} 

而且,你並不需要對這些const char *const參數第二常量。 const char *很好。