31
해 (HASHING) 2012. 01. 02( 월 ) 월 월 월 : 월월 5 월 월 월 월

해 싱(Hashing)

Embed Size (px)

Citation preview

Page 1: 해     싱(Hashing)

해 싱 (HASHING)

2012. 01. 02( 월 )

발 표 자 : 쥬신 5 기 김 경 균

Page 2: 해     싱(Hashing)

목 차

1. 해시 테이블 ( Hash Table ) 과 해싱 ( Hashing ) 이란 ?

2. 해시 함수란 ?

3. 해싱의 구조 .

4. 해시 테이블의 구조 .

5. 해시 함수의 종류 .

6. 오버플로우 (Overflow) 해결 방법 .

해 싱(HASHING)

Page 3: 해     싱(Hashing)

해 싱(HASHING)

해시 테이블 (Hash Table) 은 데이터의 해시 값을 테이블 내의 주소로 이용하는 궁극의 탐색 알고리즘이다 .

해싱 (Hashing) 은 하나의 문자열을 원래의 것을 상징하는 더 짧은 길이의 값이나 키로 변환하는 것이다 .

해시 테이블 ( HASH TABLE ) 과 해싱 ( HASHING ) 이란 ?

Page 4: 해     싱(Hashing)

해 싱(HASHING)

해싱 알고리즘을 해시 함수라고 부른다 .

해싱 함수 h(k) 는 어떤 키 k 에 대한 테이블 주소를 계산하기 위한 방법으로 주어진 키 값으로부터 레코드가 저장되어 있는 주소를 산출해 낼 수 있는 수식을 의미한다 .

충돌 위험성이 매우 적은 해시 함수라야 훌륭한 해시 함수로 평가된다 .

암호화에 사용되는 잘 알려진 해시 함수들이 몇 개 있다 . 이러한 것들에는 전자서명을 요약 메시지라고 불리는 더 짧은 값으로 바꾸는 데 사용되는 요약 메시지 해시 함수 MD2, MD4, MD5 등과 , 더 큰 요약 메시지 (60 비트 ) 를 만드는 표준 알고리즘인 SHA (Secure Hash Algorithm) 등이 포함된다 .

해싱 함수란 ?

Page 5: 해     싱(Hashing)

해 싱(HASHING)

짧은 해시 키를 사용하여 항목을 찾으면 원래의 값을 이용하여 찾는 것보다 더 빠르기 때문에 , 해싱은 데이터베이스 내의 항목들을 색인하고 검색하는데 사용된다 .

데이터베이스 검색 수법은 일치하는 것이 먼저 발견될 때까지 각 이름들을 글자단위로 확인하기 시작해야만 한다 . 그러나 , 만약 이름들 각각이 해시된다면 , 각 이름별로 4 자리의 고유한 키를 생성하는 것이 가능해진다 .

어떤 이름을 찾는 작업은 먼저 해시 값을 계산하고 , 그 다음에 그 값을 사용하여 일치여부를 비교하는 작업으로 구성된다 .

해싱 ( HASHING ) 을 사용하는 이유 .

Page 6: 해     싱(Hashing)

해 싱(HASHING)

• 사전 구조 - 맵 (map) 이나 테이블 (table) 로 불리우기도 한다 . 사전 구조는 다음과 같이 탐색키와 탐색키와 관련된 값의 2 가지 종류의 필드를 가진다 .

Ex) - 단어의 정의나 주소 또는 전화 번호같은 탐색키와 관련된 값(value)

해싱의 사전 구조 .

Page 7: 해     싱(Hashing)

해 싱(HASHING)

해시 함수란 ?

해시 함수 (Hash Function) 란 탐색키를 입력으로 받아 해시 주소 (Hash Address) 를 생성하고 이 해시 주소가 배열로 구현된 해시 테이블 (Hash Table) 의 인덱스가 된다 .

Ex)

- 영어 사전에서는 단어가 탐색키가 되고 이 단어를 해싱 함수를 이용하여 적절한 정수 i 로 변환한 다음 , 배열 요소 ht[i] 에 단어의 정의를 저장하는 것이다 .

Page 8: 해     싱(Hashing)

해 싱(HASHING)

해싱 함수의 특성 .

가장 이상적인 해싱 함수는 키 집합의 한 레코드 (record) 와 버켓 주소 집합의 한 레코드가 1 : 1 대응하여 해시 테이블의 정해진 범위에 고르게 분포되어 있어서 충돌을 최소화 하도록 하는 것인데 다음의 조건을 만족해야 한다 .

주소 계산이 빠르게 구해져야 한다 . 서로 다른 레코드의 계산된 값이 가급적 중복되지 않아야 한다 . 충돌이 적어야 한다 .

Page 9: 해     싱(Hashing)

해 싱(HASHING)

해싱 함수의 구조 .

Page 10: 해     싱(Hashing)

해 싱(HASHING)

해시 테이블의 구조 .

해시테이블 ht 는 M 개의 버켓 (bucket) 으로 이루어지는 테이블로서 ht[0], ht[1], ...,ht[M-1] 의 원소를 가진다 .

하나의 버켓은 s 개의 슬롯 (slot) 을 가질 수 있다 .

충돌 (Collision)• 서로 다른 두개의 탐색키 k1 과 k2 에 대하여• h(k1) = h(k2) 인 경우에는 충돌이 일어난다 .

이러한 충돌이 버켓이 할당된 슬롯 수보다 많이 발생하게 되면 버켓에 더 이상 항목을 저장할 수 없게 되는 오버플로우 (Overflow) 가 발생한다 .

오버플로우를 해결하기 위한 방법이 반드시 필요하다 .

Page 11: 해     싱(Hashing)

해 싱(HASHING)

해싱 함수의 종류

정적 해싱

a. 제산법 (DIVISION)b. 제곱법 (MID-SQURE)c. 숫자 분석법 (DIGIT-ANALYSIS)d. 폴딩법 (FOLDING)e. 기수 변환법 (RADIX-EXCHANGE)f. 무작위 방법 (PREUDO-RANDOM)

동적 해싱

Page 12: 해     싱(Hashing)

해 싱(HASHING)

정적 해싱 제산법 - 나머지 연산자 (%) 를 사용하여 테이블 주소를 계산하는 방법으로 , 레코드 키 값을 수치 자료로 간주하여 어떤 양의 정수 ( 대개 해시 테이블의 크기 ) 로 나눈 나머지를 홈 주소로 결정하는 가장 간단한 해싱 함수이다 .

- 버킷주소 = 키 값 % 해쉬 테이블의 크기

Ex) 12 = 512 % 100

문제점 - 해시 주소가 고르게 분포되지 않을 수 있다는 것이다 . 만약 탐색 키가 대부분이 짝수이고 M 도 짝수라면 해시 주소는 거의 다 짝수가 된다 . 이렇게 되면 홀수 버켓에는 슬롯이 많이 남게 된다 . 따라서 해쉬 테이블의 크기는 되도록이면 소수 ( 약수가 1 과 자기 자신밖에 없는 수 ) 로 선택하는 것이 좋다 .

Page 13: 해     싱(Hashing)

해 싱(HASHING)

정적 해싱

제곱법 - 제곱법은 레코드 키 값을 제곱한 후에 결과 값의 중간 부분에 있는 몇 비트를 선택하여 해시 테이블의 홈 주소로 사용한다 .

- 제곱된 결과의 중간 비트는 대개 레코드의 모든 문자에 의존하므로 , 레코드를 구성하는 몇 개의 문자가 같을 지라도 서로 다른 레코드 키는 다른 홈 주소를 갖게 될 확률이 높다 .

- 홈 주소를 얻기 위해 사용되는 비트 수는 테이블의 크기에 따라 달라지는데 , 중간 부분의 자릿수를 n 이라 하면 각 레코드 값들이 가지는 범위인 해시 테이블의 크기는 2n 이 된다 .

Page 14: 해     싱(Hashing)

해 싱(HASHING)

정적 해싱 제곱법

- 키 값 제곱 해쉬 테이블 크기에 따라 주소 값 산출

Ex) 레코드 키 값이 K = 512 이고 , 해시 테이블의 크기가 100 일 때 제곱 법에 의한 레코드 주소는 ?

-> 512 제곱 = 262144 =>> 중간 2 자리 “ 21” 최종 주소 값이 됨 .

Page 15: 해     싱(Hashing)

해 싱(HASHING)

정적 해싱

숫자 분석법 - 레코드 키를 구성하는 수들이 모든 키들 내에서 각 자리별로 어떤 분포인지를 조사하여 비교적 고른 분포를 나타내는 자릿수를 필요한 만큼 선택하여 , 레코드의 홈 주소로 사용하는 방법이다 .

- 파일의 레코드 키 값이 이미 알려진 정적 파일 (static file) 인 경우에 유용하며 , 삽입과 삭제가 빈번히 발생하는 경우에는 비효율적이다 .

Page 16: 해     싱(Hashing)

해 싱(HASHING)

정적 해싱 숫자 분석법

Ex) 해시 테이블의 크기 =1000, 홈 주소 : 0 ~999 까지 (3 자리 필요 ) 레코드 키 값이 다음의 (a) 와 같을 때 숫자 분석법을 이용하여 각 키들에 대한 홈 주소를 결정하시오 .

1. (a) 에서 왼쪽 3 자리 숫자는 거의 같으므로 제거 .

2. 왼쪽 5 열 , 6 열 , 7 열 , 9 열 역시 동일 숫자가 많이 분포 하였으므로 무시 .

3. 비교적 고른 숫자 분포를 가진 4 열 , 8 열 10 열을 선택하여 주소로 사용 .

Page 17: 해     싱(Hashing)

해 싱(HASHING)

정적 해싱

폴딩 법

- 폴딩법은 레코드의 키를 마지막 부분을 제외한 모든 부분의 길이가 동일하게 여러 부분으로 나누고 , 이들 부분을 모두 더하거나 배타적 논리합 (XOR) 을 취하여 , 해시 테이블의 홈 주소로 이용하는 방법으로 두 가지 방법이 사용된다 .

1. 이동 폴딩 (Shift Folding)

2. 경계 폴딩 (Boundary Folding)

Page 18: 해     싱(Hashing)

해 싱(HASHING)

정적 해싱 이동 폴딩

- 각 부분의 값을 계산하기 위해 마지막을 제외한 모든 부분을 이동시켜 최하위 비트 (LSB) 가 마지막 부분의 자리와 일치하도록 우측 끝을 맞추어 더한 값을 홈 주소로 하는 방법이다 .

Page 19: 해     싱(Hashing)

해 싱(HASHING)

정적 해싱 경계 폴딩

- 원래의 레코드 키 값을 여러 부분으로 나눈 후 , 나누어진 각 부분의 경계선을 종이 접듯이 접어 역으로 정렬한 다음 같은 자리에 위치한 수를 더한 값을 홈 주소로 하는 방법이다 .

Page 20: 해     싱(Hashing)

해 싱(HASHING)

정적 해싱 기수변환 법

- 기수 변환법은 어떤 진법으로 표현된 주어진 레코드 키를 다른 진법으로 간주하고 키를 변환하여 홈 주소를 얻는 방법으로 , 어떤 키 값이 16 진법으로 표현되어 있다면 이를 10 진법으로 표현된 것으로 간주하고 키 값을 변환하여 해당 레코드의 홈 주소를 구한다 . 

- 해시 테이블의 크기가 10 의 멱승으로 표현되어 변환된 해당 레코드의 주소 값이 테이블의 크기를 초과할 때는 주소 값의 최하위 자리부터 해시 테이블의 크기가 허용하는 멱승수 만큼 취하여 해당 레코드의 홈 주소로 사용한다 .

Page 21: 해     싱(Hashing)

해 싱(HASHING)

정적 해싱 기수변환 법

- Ex) 해시 테이블의 크기 = 10000(104)

- 십진수로 입력된 키 값 (B2538)10 을 16 진수로 간주하여 그 값을 다시 10 진수로 계산하는 기수 변환법을 이용하여 홈 주소를 구하시오 .

( 풀이 ) (1 * 165) + (3 * 164) + (2 * 163) + (5 *162 ) + (4 * 161) + (8 * 160)       = 1048576 + 196608 + 8192 + 1280 + 64 + 8       = (1254728)10           

   

           홈 주소 = 4728

- 레코드의 주소값 (1254728)10 에서 해시 테이블이 허용하는 하위 4자리를 선택한다 .

Page 22: 해     싱(Hashing)

해 싱(HASHING)

정적 해싱

무작위 방법

- 무작위 방법은 난수 발생 프로그램을 이용하여 난수 (random number) 를 발생시켜 각 레코드 키의 홈 주소를 결정하는 방법으로 , 보통 난수는 1 보다 작은 양의 실수를 산출하므로 ,

- 해시 테이블의 크기인 n 을 산출된 난수에 곱하여 0 ~ (n-1) 까지의 범위 값으로 변환하여 사용하며 , 만일 충돌이 발생하게 되면 그 다음 난수를 레코드의 홈 주소로 사용한다 .

Page 23: 해     싱(Hashing)

해 싱(HASHING)

정적 해싱

무작위 방법

- Ex) 키값이 12345 일 때 , 해시테이블 크기는 1000, 생성된 난수는 6, 7 이다 . 홈 주소는 ?

(6  *   12345   +     7)    mod    1000    =     77  ↑         ↑            ↑                  ↑난수 키값 난수 해시테이블크기

Page 24: 해     싱(Hashing)

해 싱(HASHING)

오버플로우 해결 방법 서로 다른 레코드 키가 동일한 홈 주소를 갖는 충돌 (collision) 현상이 발생했다는 것은 특정 레코드의 키 값인 K 의 해싱 함수값 h(K) 의 해시 테이블 주소에는 이미 다른 레코드 키가 보관되어 있다는 것을 의미하므로 , 버켓의 크기가 1 인 경우 충돌을 유발한 레코드 키 K 를 저장하기 위해 다른 기억 장소를 검색해야 한다 .

이와 같이 다른 기억 장소를 찾아 충돌을 유발한 레코드를 저장하는 일을 과잉 상태 처리라 한다 .

1. 선형 검색법2. 2 차 검색법3. 무작위 검색법4. 체인이용법

Page 25: 해     싱(Hashing)

해 싱(HASHING)

오버플로우 해결 방법

선형 검색법 - 선형 검색법은 충돌을 해결하는 가장 간단한 방법으로 , 충돌 발생시 새로운 레코드 키를 저장할 기억 공간을 찾기 위해 충돌이 일어난 그 위치에서 테이블 순으로 차례대로 하나씩 검색하여 첫번째 빈 영역에 레코드 키를 저장하여 충돌을 해결하는 방법이다 .

- 충돌을 일으킨 레코드 키 K 를 저장할 후속 주소 h1(K) = h0(K) + 1 이 되고 , h1(K) 에 새로운 레코드의 저장이 가능한지 확인하여 빈곳이면 그곳에 레코드를 저장하고 , 그렇지 않으면 빈 곳을 찾을 때까지 다음 후속 주소를 따라 검색을 계속한다 .

Page 26: 해     싱(Hashing)

해 싱(HASHING)

오버플로우 해결 방법 선형 검색법

- 만약 테이블의 끝에 도달하게 되면 다시 테이블의 처음으로 간다 .

- 만약 조사를 시작했던 곳으로 되돌아오게 되면 테이블이 가득 찬 것이 된다 .

- hi(k) = h0(k) + i

장 점 : 구조가 간단하다 . 단 점 : 최악의 경우 해시 테이블 전체를 검색해야 하는 상황이 발생 할 수 있으므로 비효율 적이다 .

Page 27: 해     싱(Hashing)

해 싱(HASHING)

오버플로우 해결 방법 2 차 검색법

- 2 차 검색법은 선형 검색법에서 발생하는 제 1 밀집 (primary clustering) 문제를 제거하는 방법으로 , 기대되는 충돌 함수는 이차식인 f(i)= i2 이 된다 .

- 원래의 테이블 주소로부터 다음 주소를 결정하는 거리 d 가 1, 4, 9, 16, … 과 같이 떨어진 영역을 차례대로 검색하여 처음으로 발견되는 빈 영역에 해당 레코드를 저장함으로써 충돌을 해결하는 방법이다 .

- hi(k) = (h0(k) + i^2) % n

Page 28: 해     싱(Hashing)

해 싱(HASHING)

오버플로우 해결 방법

무작위 검색법

- 충돌을 유발한 레코드 키를 저장할 수 있는 가용공간을 찾을 때까지 난수 계산 프로그램을 실행하여 해시 테이블의 홈 주소를 다음 후속 주소로 택하여 충돌을 해결하는 방법이다 .

- 해시 테이블의 크기 = n , i 번째 발생한 난수를 ri 라고 할 때 i 번째 후속 주소 hi(k)  는 아래 공식과 같다 .

- hi(K) = (h0(K) + ri)  mod  n

Page 29: 해     싱(Hashing)

해 싱(HASHING)

오버플로우 해결 방법 체인 이용법

- 해시 함수에 의해 같은 기억공간에 할당되어 충돌이 발생한 레코드들을 연결 리스트 (Linked List) 로 연결하는 방법으로 해시 테이블 자체는 포인터의 배열로 만들고 , 같은 버켓에 할당되는 레코드들을 체인으로 만들어 연결한다 .

Page 30: 해     싱(Hashing)

해 싱(HASHING)

오버플로우 해결 방법 체인 이용법

- 해시 연쇄법은 연결 리스트를 사용하므로 해시 테이블에서의 삽입이나 삭제 연산이 용이하며 , 충돌의 횟수를 감소시키지는 못하지만 , 다른 충돌 해결 방법에 의해 해시 테이블을 검색할 때 발생하는 소요시간을 감소시킬 수 있다 .

장 점 :

- 충돌이 발생한 명칭들만 연결 리스트에서 검색해 주면 되므로 속도가 빠르다 .

- 삽입 가능한 명칭의 수가 해시 테이블 크기에 영향을 받지 않는다 .

단 점 : 구조가 복잡하고 기억 장소 소모량이 많다 .

Page 31: 해     싱(Hashing)

해 싱(HASHING)

Q & A

THANK YOU…