2016-02-27 60 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你说得对,编辑过。 –