해쉬 테이블에서 이해가 안가는 부분 ...
글쓴이: Sailor_moon / 작성시간: 목, 2012/02/09 - 2:17오후
int h = 0; h = hash1(string); h = h%MAX_HASH_SLOT; unsigned long hash1(char* str){ unsigned long hash = 5381; int c; while(( c = *str++) != 0) hash = (( hash <<5) + hash) + c; return hash; }
이부분이 이해가 안됩니다. 해쉬의 인덱스를 찾는 방법중 하나인가요 ? 저 hash1 함수가 무엇인지요 ?
Forums:
해쉬 함수 중 하나인듯 하네요.
해쉬에 대한 자세한 내용은
영문 : http://en.wikipedia.org/wiki/Hash_function
한글 : http://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98
에서 보실 수 있구요
저 함수는 5381이라는 소수와 입력 문자열인 str을 조합해 인덱스를 리턴하는 구조 같은데요.
hash의 비트를 왼쪽으로 5번 shift하고(즉 2의 5승인 32를 곱하고) 다시 해쉬를 더한 후 문자열 중 한 문자를 더하는 과정을 반복하네요.
그리고 최종 리턴값에 MAX_HASH_SLOT으로 나머지 연산을 함으로써 최종 인덱스를 구할 수 있습니다.
해쉬 함수는 정의하기 나름인데 보통 소수가 나오게 하면 충돌할 위험이 적어져 소수를 선호합니다. (하지만 hash1함수의 리턴값이 소수라는 보장은 없네요)
윗분이 잘 설명하셨는데, 좀더 덧붙이면...
해시함수에서 산출되는 해시값은
골고루 분산될 수 있는 값으로 산출해야 해싱의 효율이 좋아집니다.
unsigned long hash1(char* str)
위의 해시함수는 문자열을 입력받아 정수형의 해시값을 반환하는데,
문자열은 업무논리로 본다면 키값에 해당하고,
이 키값으로 산출된 해시값이 해시 테이블의 인덱스가 됩니다.
MAX_HASH_SLOT은 해시 테이블의 크기(인덱스 최대값) 입니다.
해시값은 0과 MAX_HASH_SLOT 사이에서 골고루 분산되도록 하는 것이
핵심기법이고 해시함수가 그 역할을 합니다.
From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
댓글 달기