2011-12-19 5 views
4

문자열을 정수로 해시하는 C++의 해시 함수를 찾고 있습니다. 나는 CMapStringToPtr을 사용했지만 "GetNextAssoc"라는 함수를 사용하여 문자열을 키로 검색 할 수 있습니다. 즉 문자열을 저장해야하며 너무 많은 메모리를 가져옵니다. 메모리가 적어지고 문자열을 저장하지 않는 다른 해시 함수가 있습니까?문자열에서 int 로의 C++에서 해시 함수

+7

'std :: hash ()()'을 사용해보십시오. –

+1

질문을 이해할 수 있는지 잘 모르겠습니다. 해시 함수를 사용할 거의 모든 장소에서 해시 함수에는 모두 충돌이 있으므로 해시 함수를 사용하여 원본 데이터를 추적해야하며 해시를 기반으로하는 조회가 필요하면 원래 데이터가 필요하므로 충돌을 해결해야합니다. 그들은 발생합니다. – Omnifarious

+0

네,하지만 메모리 사용량 때문에 원본 데이터를 유지할 필요가 없습니다. 또한 충돌을 해결하고 싶지 않습니다. 실제로 목표는 충돌을 유지하는 것입니다! – Bipario

답변

9

C++은 모든 STL 해시 컨테이너에 사용되는 해시 함수가 내장되어 있습니다.

std::hash

PS : 당신은 할 수 있습니다 자신도 단지 정수에 추가 한 후 일부 값 :

+0

아마도 틀 렸지만 링크가 SGI 확장 (SGI 에 정의되어 있음)을 참조하고 C++ 11 이전에 C++ 표준의 일부가 아니 었습니다 (에 정의 된 위치). –

+0

나는 절반을 말하고 싶다. 확장 기능이라고 생각하지만 시스템에없는 경우 매우 놀랍습니다. 거의 모든 곳에서 사용됩니다. –

+0

mod에서 어떤 값으로 무엇을 의미합니까? – dustinyourface

2
에 의해 MOD, 그 문자 하나 하나를 통해 const를 참조 사이클에 의해 문자열을 전달
int hash(const string &key, int tableSize) { 
    int hashVal = 0; 

    for(int i = 0; i<key.length(); i++) 
    hashVal = 37*hashVal+key[i]; 

    hashVal %= tableSize; 

    if(hashVal<0) 
    hashVal += tableSize; 

    return hashVal; 
}