본문 바로가기
컴퓨터/Algorithm

문자열의 해시함수(Honor's method)

by 빵케잌 2019. 12. 21.

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