10개의 데이터를 해싱하는법

조회수 1451회

말그대로 10개의 정수를 해싱 하고싶은데

제가 아직 해싱에대한 개념이 부족해서 잘 모르겠네요

일단 젠킨스의 해시 함수를 이용해서 해시를 하려구 했거든요.

// Robert Jenkins' 32bit hash function
unsigned __int32 hash(unsigned __int32 key)
{
    key += (key<<12);
    key ^= (key>>22);
    key += (key<<4);
    key ^= (key>>9);
    key += (key<<10);
    key ^= (key>>2);
    key += (key<<7);
    key ^= (key>>12);

    return key;
}

근데 제가 3이란 값을 해시함수에 넣어 출력해보니 948077404이나오더라구요

그러면 해시테이블을 어레이로 만들려고 하는데 어레이 크기를 948077404만큼 잡아서 만들어야하나요??

저는 10개정도의 데이터만 해싱하면 되는데.. 어떻게 해야할까요?

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    일단 해쉬에 대해서 이야기를 조금 해보면요.

    해쉬 함수는 가변 크기의 원본 데이터를 고정 크기의 해쉬 값으로 변환시켜줍니다.

    이 변환으로 나온 결과인 해쉬 값은 원본 데이터의 특징을 담고 있습니다.

    이렇게 가변 크기의 데이터를 고정 크기의 데이터로 변환하면서 얻는 장점은 비교 연산을 할 때 속도를 향상 시킬 수 있습니다. 해쉬 값은 원본 데이터 보다 일반적으로 크기가 작아 빠르게 원본 데이터가 같은지 다른지를 비교할 수 있습니다.

    원본 데이터를 빠르게 비교하기 위해서 사용합니다. 빠르게 비교할 수 있다는 것은 빠르게 원본이 동일한 데이터를 찾을 수 있는 것을 의미합니다. 이런 특성으로 키(해쉬) 를 이용하여 빠르게 값(키와 매칭되는 특정 데이터) 찾을 수 있는 자료 구조인 맵, 사전, 해쉬 테이블, 셋 등 을 만들 수 있습니다.

    물론 정보량이 줄어드는 것이기 때문에 원본 데이터와 해쉬 값이 1:1 매칭이 될 수 없습니다. 다른 원본 데이터여도 같은 해쉬 값을 가질 경우가 생기며, 이를 해쉬 충돌 이라고 부릅니다.


    본론으로 넘어와서 해쉬 값을 모두 담을 수 있는 배열을 생성하는 것은 거의 불가능 하며, 사용하지 않을 데이터를 위해 메모리를 확보하게 되는 것이기 때문에 좋지 못합니다.

    일단 10개의 데이터를 사용한 거라면 10개의 원소를 갖는 배열을 만들면 됩니다.

    좀더 자세히 하면 코드가 길어지니 개념적으로 간결하게 표현해 보면 아래와 같습니다.

    struct Node {
        unsigned __int32 key;
        void* value;
    } table[10];
    memset(table, 0, sizeof(table));
    
    // table 에 해쉬와 값을 추가
    table[0].key =  hash(1); // 1은 임의 키
    table[0].value = malloc(sizeof(int)); // 임의의 값
    // ...
    

    이런식으로 해쉬 태이블을 만들어 을 넣을 수 있습니다. 물론 실제론 위와 같이 간단한 구조로 만들지 않습니다. 또한 에 대해서 정렬을 하여 검색 속도를 향상 시키기도 합니다.

    이후 아래 처럼 를 비교하여 찾으려는 원본 데이터를 빠르게 찾을 수 있습니다.

    int i, key;
    void* value;
    
    key = hash(1); // 찾으려는 원본 데이터의 해쉬
    value = NULL;
    for (i = 0; i < (sizeof(table) / sizeof(*table)); ++i) {
        if (table[i].key == key) {
            value = table[i].value;
            break;
        }
    }
    
    if (value != NULL) {
        // 키에 해당하는 값을 찾음
    }
    

    첨언으로 단순히 정수 10개를 이용하는 해쉬 테이블은 그냥 정수 10개 넣고 만든 배열 보다 속도가 빠르지 않습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)