2016-02-27 79 views
-1

當我通過「冰」時,這應該返回451845518507,但它返回873,952,427任何人都可以告訴我爲什麼? (MAX_STR_SIZE = 501)遞歸的哈希碼?

unsigned long hash_code(const char *str){ 
    char temp[MAX_STR_SIZE]=""; 
    unsigned long multiplied; 
    if(str == NULL){ 
    return SUCCESS; 
    } 
    else if(strlen(str)==0 || str==""){ 
    return SUCCESS; 
    } 
    else{ 

     strncpy(temp,str, strlen(str)-1); 
     temp[strlen(str)-1]=0; 


     multiplied = (hash_code(temp)*65599 + (int) str[strlen(str)-1]); 
     return multiplied; 
    } 
} 
+2

混合'SUCCESS'和散列值看起來很可疑。 – AlexD

+0

SUCCESS只是零的符號 – Jenny

+1

使用'* str =='\ 0''而不是'str =='「' –

回答

5

unsigned long是在機器上只有32位。需要更廣泛的類型451845518507

451,845,518,507 mod pow(2,32) --> 873,952,427 
1

這裏是固定的代碼:

#include <stdio.h> 
#include <string.h> 

#define MAX_STR_SIZE 501 

unsigned long long hash_code(const char *str){ 
    char temp[MAX_STR_SIZE] = ""; 
    unsigned long long hash; 
    if(str == NULL || strlen(str) == 0 || *str == '\0'){ 
     return 0; 
    } 
    else{ 
     strncpy(temp, str, strlen(str) - 1); 
     hash = hash_code(temp) * 65599 + str[strlen(str) - 1]; 
     return hash; 
    } 
} 

int main(void) 
{ 
    char str[] = "ice"; 
    unsigned long long hash; 
    hash = hash_code(str); 
    printf("%llu", hash); 
    return 0; 
} 

你需要一個unsigned long long包含451,845,518,507

+0

@chux你說得對,編輯過。 –