PS 분야에서 일반적인 해시 함수는 다음과 같다. (DJB)
※ 다른 해시 함수들을 알고 싶다면 사이트 참고
https://www.partow.net/programming/hashfunctions/
unsigned long hash(const char *str) // DJB
{
unsigned long hash = 5381;
int c;
while (c = *str++)
{
hash = (((hash << 5) + hash) + c) % MAX_TABLE;
}
return hash % MAX_TABLE;
}
Honor's method를 적용한다면, 해시함수 자체로 문자열의 비트화를 시킬 수 있다.
a-z로만 이루어진 문자열을 27진수로 나타낸다면 unsigned long long 기준 문자열 길이 13까지 나타낼 수 있다.
(27^13 < 2^64 < 27^14)
이 함수의 장점은 충돌 방지를 위해 해시테이블이 가진 원본 문자열 대신 unsigned long long 변수를 넣어 이 자체가 문자열인 것이므로, 시간 복잡도, 공간 복잡도를 줄일 수 있다.
문자열 비교시 시간 성능 : char [] < unsigned long long
unsigned long long hash(const char *str) // DJB
{
unsigned long long hash = 0;
int c;
while (c = (*str++ - 'a'))
{
hash = hash * 27 + c;
}
return hash % MAX_TABLE;
}
'컴퓨터 > Algorithm' 카테고리의 다른 글
배열 초기화 (0) | 2019.12.22 |
---|---|
힙 (0) | 2019.12.21 |
더블 링크드리스트 (0) | 2019.12.21 |
배열 기반 링크드리스트(myalloc) (0) | 2019.12.21 |
자료형 별 표현 크기 (0) | 2019.12.16 |