2014-10-27 86 views
0

所以我做的哈希碼函數算法算法: 對於每個字符旋轉當前位三位離開 添加的每個字符的值, XOR運算結果當前 下面的代碼我到目前爲止:通過在C哈希碼位運算

unsigned int hash_function(const char *k){ 
    unsigned int current = 0; 
    unsigned int rot = 0; 
    int i = 0; 
    int r = 0; 
    for(i = 0; i < strlen(k); i++){ 
     for(r = 0; r < 3; r++){ 
      rot = ((rot & 1 (1 << 31)) >> 31 | (rot << 1); 
     } 
     rot += k[i]; 
     current ^= rot; 
     rot = current; 
    } 
    return current; 
} 

一些例子,該算法應該給 「給我」 = 477003, 「避難所」 = 41540041 然而,這種算法不給我正確的結果。我很確定我正在使用正確的旋轉操作,然後按照原樣進行操作。我想知道是否有人能指出我正確的方向。 感謝,並希望我格式化這個問題的正確

+2

我想你的意思是把'腐=((腐&(1 << 31)) >> 31)|(腐<< 1);'但循環是不必要的 - 使用'rot =((rot&(7 << 29)) >> 29)|(rot << 3);'而不是 – 2014-10-27 22:25:04

回答

1

我想你的意思是把rot = ((rot & (1 << 31)) >> 31) | (rot << 1);。但循環是不必要的 - 用rot = ((rot & (7 << 29)) >> 29) | (rot << 3);代替。 。

這應該工作:

unsigned int hash_function(const char *k){ 
    unsigned int current = 0; 
    unsigned int rot = 0; 
    int i = 0; 
    for (i = 0; i < strlen(k); i++){ 
     rot = ((rot & (7 << 29)) >> 29) | (rot << 3); 
     rot += k[i]; 
     current ^= rot; 
     rot = current; 
    } 
    return current; 
} 
+1

無需'INT R = 0',因爲它解決了讓我好奇的事情,我upvoting這個答案 - ?爲什麼OP使用內循環 – 2014-10-27 22:32:20

+0

@MichaelPetch好一點,我會解決這個問題。 – 2014-10-27 22:33:53

+0

非常感謝,我沒有意識到你c應該這樣做,沒有一個循環 – 2014-10-27 22:36:45

0

這是最初只是一個評論,但事實證明,這是回答你的問題。

在此行中:

rot = ((rot & 1 (1 << 31)) >> 31 | (rot << 1); 

你有一個額外1和一個額外的(,妨礙它編譯於GCC:

main.c: In function ‘hash_function’: 
main.c:11:29: error: called object is not a function or function pointer 
      rot = ((rot & 1 (1 << 31)) >> 31 | (rot << 1); 
          ^
main.c:11:58: error: expected ‘)’ before ‘;’ token 
      rot = ((rot & 1 (1 << 31)) >> 31 | (rot << 1); 
                 ^
main.c:12:9: error: expected ‘;’ before ‘}’ token 
     } 
     ^

刪除這兩件事情:

rot = (rot & (1 << 31)) >> 31 | (rot << 1); 

it works

在未來,你可能希望找到一個編譯器,可以檢測到這樣的錯誤。我真的很驚訝,你的沒有。

+0

這實際上是我製作的複製和粘貼錯字,我使用了一個檢測錯誤的編譯器。很多的貢獻 – 2014-10-27 22:37:39