2011-08-22 3 views
11

int 배열을 키로 사용할 수 있도록 unordered_map의 해시 함수를 특수화해야합니다. 배열 값은 대개 0 또는 1입니다. int array = {0, 1, 0, 1}이지만 기술적으로 제한되지는 않습니다.int 배열을위한 C++ 해시 함수

이 경우 누군가가 좋은 해시 함수를 추천 할 수 있습니까? 또는 int 배열을 항상 문자열로 변환하고 특수화를 피할 수 있습니다. 하지만 필자는 이러한 어레이가 수백만 개에 달할 수도 있기 때문에 성능에 대해 우려하고 있습니다.

+2

부스트의 "범위 해시"를 사용하거나 모방합니다. 이것은 Boost에 있고 실제로 표준에 있어야하는'hash_combine'을 반복적으로 호출함으로써 구축됩니다. –

+0

배열이 수백만 개가 있다면 새로운 알고리즘/데이터 구조를 제안합니다. – Blindy

+0

@Blindy 어떤 데이터 구조를 제안 하시겠습니까? – gewizz

답변

6

C++ TR1은 해시 템플릿 함수를 포함합니다.

아직 없으면 해시 부스트를 사용할 수 있습니다. 편리한 도우미에 대한

아이디어 :

#include <boost/functional/hash.hpp> 

template <typename T, int N> 
    static std::size_t hasharray(const T (&arr)[N]) 
{ 
    return boost::hash_range(arr, arr+N); 
} 

이 (? 약) 것

size_t seed = 0; 
for (const T* it=arr; it!=(arr+N); ++it) 
    boost::hash_combine(seed, *it); 
return seed; 

에 해당하면이를 사용하는 경우 적절한 동등 비교 연산을 구현하는 것을 잊지 마세요 검색을위한 해시

+0

'std :: size_t N '은 가능한 가장 큰 배열의 크기를 나타낼 수 있기 때문에'std :: size_t N'이어야한다고 생각합니다. 반면에'int'는 오버 플로우 될 수 있습니다 (시스템에 따라 다름). 또한 서명 된 유형일 필요는 없습니다. – outofthecave

+0

@outofthecave fair points. 그러나 부호없는 것은 전염성이있어 오프셋에서 다루기가 쉽지 않습니다 (음수가 될 수 있고 'N-10'이 'N <10'이면 둘러 쌀 것입니다.). 또한 배열은 2½¹보다 큰 요소에 정적으로 입력됩니까? 그것들은 드물다. 그리고 그 (것)들이있는 경우에, 당신은 수시로 그 (것)들을 해싱하지 않을 것입니다. – sehe

5

해시 함수를 사용하여보십시오. lookup8 이 기능은 매우 빠르며 훌륭합니다.

int key[100]; 
int key_size=10; 
for (int i=0;i<key_size;i++) key[i]=i; //fill key with sample data 
ub8 hash=hash((ub8*)key, sizeof(key[0])*key_size, 0); 
+0

그건 C++이 아니에요. – Puppy

+9

일반적으로 해시 함수는 일반 c로 작성됩니다. 당신은 그것에 대한 C++ 래퍼를 만들 수 있습니다. – vromanov

+2

일반적으로 해시 함수는 * 손에있는 언어로 작성됩니다. – Puppy