[英]Hash code recursively?
This should return 451,845,518,507 when I pass in "ice" but it is returning 873,952,427 can anyone tell me why? 当我输入“ ice”时,应该返回451,845,518,507,但是返回873,952,427,有人可以告诉我为什么吗? (MAX_STR_SIZE = 501) (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;
}
}
unsigned long
is only 32-bit on your machine. unsigned long
在您的计算机上只有32位。 Need a wider type for 451,845,518,507 需要更广泛的类型用于451,845,518,507
451,845,518,507 mod pow(2,32) --> 873,952,427
Here is the fixed code: 这是固定代码:
#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;
}
You need a unsigned long long
to contain 451,845,518,507
. 您需要一个unsigned long long
来包含451,845,518,507
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.