2015-01-07 3 views
1

연구 프로젝트의 일환으로 Eternally Confuzzled에서 찾은 일부 해시 함수를 테스트했습니다. here. 이 프로젝트는 페이지 캐싱 알고리즘과 관련이 있으며 해시 동작 자체는 지금까지는 결코 중요하지 않았지만 지금도 내 호기심을위한 것입니다. 테스트에, 나는 다음과 같은 코드를 사용하고 있습니다 :다른 프로그램 실행간에 해시 값이 일치하지 않는 이유는 무엇입니까?

#include <iostream> 
#include <cstdlib> 
#include <string> 

using namespace std; 

unsigned oat_hash(void *key, int len); 

int main() 
{ 
    string name; 

    cout << "Enter a name: "; 
    getline(cin, name); 
    cout << "Hash: " << oat_hash(&name, sizeof(string)) << endl << endl; 
    cout << "Enter the name again: "; 
    getline(cin, name); 
    cout << "Hash: " << oat_hash(&name, sizeof(string)) << endl << endl; 

    return 0; 
} 

unsigned oat_hash(void *key, int len) 
{ 
    unsigned char *p = (unsigned char*) key; 
    unsigned h = 0; 

    for (int i = 0; i < len; i++) { 
     h += p[i]; 
     h += (h << 10); 
     h ^= (h >> 6); 
    } 

    h += (h << 3); 
    h ^= (h >> 11); 
    h += (h << 15); 

    return h; 
} 

프로그램 실행을 하나 출력 :

Enter a name: John Doe 
Hash: 4120494494 

Enter the name again: John Doe 
Hash: 4120494494 

프로그램 실행이 출력 :

Enter a name: John Doe 
Hash: 3085275063 

Enter the name again: John Doe 
Hash: 3085275063 

나는 같은 문자열을 입력하고있어 동일한 프로그램 실행 중에 동일한 해시 값을 사용하지만 다른 프로그램 실행에 대해 값이 다른 이유는 무엇입니까? 다른 해시 값이 다른 데이터를 나타내지 않습니까?

+0

난 그냥 5 개 실행을했고, 동일한 출력을 얻었다. – Ben

+0

아마도 공백을 입력했는데 실현하지 못했을 것입니다. – Ben

+0

그건 내가 처음에 생각한 것이지만, 나는 그것을 확인했다. 나는 다른 입력과 결과 (다른 프로그램 실행을위한 다른 해시 값을 얻는 결과)를 사용했습니다. –

답변

2

std::string의 구현에는 포인터가 포함되어 있습니다. std::string의 실제 텍스트가 아닌 std::string의 내부를 해시합니다. 최신 시스템에서는 스택 위치가 무작위로 지정되고 freestore 할당이 무작위로 지정되어 실행할 때마다 std::string의 다른 내부 구조가 생성됩니다.

당신은 아마 다음과 같은 코드를 변경할 수 있습니다 :

unsigned oat_hash(void const *key, int len) 
{ 
    unsigned char const *p = static_cast<unsigned char const *>(key); 
    // etc. 
} 

//... 

cout << "Hash: " << oat_hash(name.c_str(), name.size()) << endl << endl; 
+0

대단히 감사합니다. 이것은 좋은 설명과 솔루션입니다. 내가 upvote 수 있다면, 나는 확실히 것입니다. –

+0

정말 재미 있습니다. +1 – Ben

관련 문제