2017-03-18 19 views
1

변환 된 숫자를 해시 함수의 키 값으로 사용하기 위해 char * type C 문자열을 긴 정수로 변환하려고했습니다. 나는 atol과 strtol 함수를 모두 시도해 보았고, 다른 문자열을 가진 함수를 호출 할 때마다 둘 다 같은 해시 값을 반환했다. 다음은 내 해시 함수이다.string에서 long int 로의 변환은 다른 문자열에 대해 같은 값을 반환합니다.

int h_function(char* key,h_table* table){ 
    int i; 
    char* key_i=key; 
    char str[14]; 
    char code[4]; 
    char number[11]; 
    long result; 
    //printf("%c\n",key_i[13]); 
    //there is a "-" in key[3] so i want to remove that first 
    for(i=0;i<3;i++){ 
     code[i]=key_i[i]; 
    } 
    code[3]='\0'; 
    printf("This is the code: %s\n",code); 
    for(i=0;i<10;i++){ 
     number[i]=key_i[i+4]; 
    } 
    number[10]='\0'; 
    printf("This is the number: %s\n",number); 
    strcpy(str,code); 
    strcat(str,number); 
    printf("This is the full key number: %s\n",str); 
    //converting to long int 
    result=atol(str); 
    printf("This is the key converted to an integer: %ld\n",result); 
    int hash_value=(result % table->size); 
    printf("The hashvalue is: %d\n",hash_value); 
    return hash_value; 
} 

그리고 이것은 출력 내가 얻을 :

전체 키 번호가 변경에도 불구하고
This is the code: 357 
This is the number: 5472318696 
This is the full key number: 3575472318696 
This is the key converted to an integer: 2147483647 
The hashvalue is: 22 
This is the hashed index: 22 

내가 인수로 전달하는 숯불 * 키에 따라, 변환 된 정수가 동일하게 유지뿐만 아니라, 해시 값 나는 어떤 도움을 주셔서 감사하겠습니다 ... 미리 감사드립니다.

답변

1

이는 3575472318696이 int 또는 long (구현시 32 비트라고 가정)에 맞지 않기 때문입니다. 1 = 2147483647

+0

그게 문제 야가 오래 오래 INT 및 사용 산호초에 유형을 변경, 그래서 감사합니다 -이 경우 최대 길이 값을 반환처럼

그것은^(31)이 보인다 atol 대신 완벽하게 작동합니다! –

+2

@LoriKougioumtzian strtoll()은 호출자에게 입력 값이 너무 길어 long long에 적합하지 않다는 것을 알리는 방법이 있으므로 strtoll()을 사용하는 것이 더 좋습니다. – Jens

+1

[atoi()] (http://stackoverflow.com/q/17710018/995714)를 사용해야하는 이유는 무엇입니까? [유해하다고 생각하기 때문에] (https://blog.mozilla.org/nnethercote/2009/03/13/atol-considered-harmful/) –