검수요청.png검수요청.png

해싱

해시넷
이동: 둘러보기, 검색

해싱(hashing)은 통상적인 반복 비교를 통하지 않고 특정 계산만으로 자료 저장 주소를 찾아내는 탐색 방법을 뜻한다.

개요[편집]

키 값을 해시 함수로 계산해 결과값을 주소로 값에 접근하는 방법으로 전자서명, 보안 알고리즘, 해시테이블 생성 시 주로 사용된다.

특징[편집]

  • 빠르게 자료를 삽입하고 저장하고 불러올 때 유용하다.
  • 주어진 키 값을 갖는 레코드를 해시함수로 산출한 주소로 저장위치에 접근한다.
  • 모든 원소에 대한 접근이 동일 시간 내에 이뤄진다.
  • 검색의 효율성이 낮다.

자료구조에서의 해싱 구현[편집]

자료구조에서 해싱을 구현하는 방법은 다음과 같다.[1]

정적 해싱[편집]

  • 정적 해싱(static hashing)은 고정 크기의 배열을 이용한 방법으로 버킷 주소의 집합을 고정하며 현 파일의 크기를 고려해 해시 함수를 결정한다.
  • 파일 크기를 예상하여 해시 함수를 결정하며 파일 크기의 증가에 따라 주기적으로 해싱 구조를 재구성한다.
  • 구현이 쉽고 간단하나 버킷의 크기를 작게 잡을 경우 해시충돌의 위험성이 따르고, 크게 잡을 경우 메모리가 낭비된다.
  • 데이터의 증감에 따라 해싱 구조를 재구성해야 하기 때문에 추가적인 리소스가 필요하며 데이터의 증가에 따라 검색의 효율성이 저하된다.

제산법[편집]

  • 제산법(division)은 나머지 연산자를 사용해 인덱스를 계산하는 방법으로, 레코드 키 값을 수치 자료로 간주하여 어떤 양의 정수(대개 해시테이블의 크기)로 나눈 나머지를 홈 주소로 결정하는 간단한 방법이다. 인덱스를 구하는 공식은 이러하다.
키 값 % 전체 버킷의 크기 = 인덱스
  • 해시된 주소가 고르게 분포되지 않을 수 있기에 전체 버킷의 크기를 소수로 잡아 성능을 향상시킨다.
  • 부하율(Load Factor)은 70~80%가 적당하다.

중간제곱법[편집]

  • 중간제곱법(mid-square)은 키 값을 제곱한 뒤, 결과값의 중간 부분에 있는 몇 비트를 선택해 인덱스로 사용한다.
  • 제곱된 결과의 중간 비트는 모든 키 값의 모든 문자의 영향을 받으므로 키를 구성하는 일부 문자가 동일해도 결과값이 다를 확률이 높다.
  • 홈 주소를 얻기 위해 사용되는 비트 수는 테이블의 크기에 따라 달라지는데, 중간 부분의 자릿수를 n 이라 하면 각 레코드 값들이 가지는 범위인 해시 테이블의 크기는 이 된다.
  • 인덱스를 구하기 위해서 사용되는 비트의 수는 전체 버킷의 크기에 따라 달라진다.

폴딩법[편집]

  • 폴딩법(folding)은 마지막 부분을 제외한 키를 균등하게 나누고 XOR 연산을 해 인덱스로 이용한다.
  • 이동폴딩(Shift Folding) : 마지막을 제외한 모든 부분을 이동해 최하위 비트가 마지막 부분의 자리와 일치하도록 우측 끝을 맞춰 더한 값을 인덱스로 사용한다.
  • 경계 폴딩(Boundary Folding) : 키 값을 여러 부분으로 나누고 각 부분의 경계선을 역으로 정렬한 뒤 같은 자리에 위치한 수를 더한 값을 인덱스로 사용한다.
3 0 1 2 3 0 1 2 3 2 1 3 3 0
P1 P2 P3 P4 P5

이중폴딩 ==> P1+P2+P3+P4+P5 = 301+230+123+213+30 = 897이 홈주소가 된다.
경계폴딩 ==> P1+P2(역)+P3+P4(역)+P5 = 301+032+123+312+30 = 798이 홈주소가 된다.

숫자분석법[편집]

  • 숫자분석법(digit-analysis)은 키를 구성하는 수가 모든 키들 내에서 어떻게 분포되어있는지 조사하고, 고르게 분포되어 있는 자릿 수를 필요량에 따라 선택해 인덱스로 사용한다.
  • 파일의 키 값이 정적 파일일 때 유용하지만 수정이 빈번할 시에는 비효율적이다.
예) 해시 테이블의 크기 = 1000, 홈 주소: 0~999까지(3자리 필요) 레코드 키 값이 다음의 (a)와 같을 때 숫자 분석법을 이용하여 각 키들에 대한 홈 주소를 결정하시오.
 (레코드 키 값)  (각 키의 홈 주소)
012 - 452 - 0236 ==> 426
012 - 153 - 0530 ==> 150
015 - 342 - 0935 ==> 395
012 - 752 - 1032 ==> 702
012 - 852 - 0470 ==> 840
012 - 543 - 0231 ==> 512
(1) (a)에서 왼족 3자리는 거의 같으므로 제거
(2) 왼쪽 5열, 6열, 7열, 9열 역시 동일 숫자가 많이 분포하므로 무시
(3) 비교적 고른 숫자 분포를 가진 4열, 8열, 10열을 선택하여 주소로 사용

기수변환법[편집]

  • 기수변환법(radix-exchange)은 진법으로 변환된 키를 다른 진법으로 간주하고 키를 변환해 인덱스를 얻는다.
  • 배열의 크기가 10의 거듭제곱으로 표현되어 변환된 인덱스가 배열의 크기를 초과할 시, 인덱스의 최하위 자리부터 배열의 크기가 허용하는 자릿수만큼 취해 인덱스로 사용한다.
예) 해시 테이블의 크기 = 100000
십진수로 입력된 키 값(B2538) 10을 16진수로 간주하여 그 값을 다시 10진수로 계산하는 기수 변환법을 이용하여 홈 주소를 구하시오.
 
홈 주소 = 4728(레코드의 주소값에서 해시 테이블이 허용하는 하위 4자리를 선택한다)

무작위 방법[편집]

  • 무작위 방법(pseudo-random)은 난수생성기를 사용해 난수를 만들어 인덱스를 결정한다.
  • 난수는 1보다 작은 양의 실수로 산출되므로 배열의 크기를 난수에 곱해 사용하며 해시 충돌 시 그 다음 난수를 인덱스로 사용한다.

동적 해싱[편집]

  • 동적 해싱(daynamic hashing)은 데이터의 증감에 따라 배열의 크기를 동적으로 변화시키며 오버플로우 발생 시 테이블의 크기를 2배수로 확장한다. 분할할 시 해시된 키의 다음 유효 비트가 0인 키를 한 버킷에 두고, 1인 키를 다른 버킷에 둔다.
  • 버킷의 수를 유동적으로 관리하며 해싱된 키를 인덱스로 사용하는 이진 트리를 동적으로 변환하여 사용한다.
  • 데이터에 증감에 따라 버킷을 쪼개거나 합치고 버킷을 포인터로 가리키는 인덱스 테이블을 생성/유지해야 한다. 이때 부하가 발생할 수 있다.
  • 다중 레벨 인덱스를 관리하며 로직이 복잡하다.
  • 데이터가 증가해도 검색의 성능이 유지되며 메모리의 낭비가 적다.
  • 접근 시간을 일정하게 유지해야할 수 있다.

확장해싱[편집]

  • 확장해싱(extendible hashing)은 트리의 깊이가 2이며 일부 비트열만을 사용하고 버킷이 더 필요할 시 비트열을 하나씩 추가한다.
  • 이진수 표현을 기반으로 하며 데이터 수에 따라 버킷의 수가 변한다.
  • 2d개의 인덱스를 갖는 배열이며 해시된 키의 처음 d개 비트를 디렉터리 배열의 인덱스 값으로 정하는데 사용한다.
  • 처음 d'개의 비트 값이 갖는 키가 하나의 버킷에 저장되며 여러 디렉터리 엔트리가 같은 인덱스를 유지하고 각 버킷 내의 해시된 키가 기반으로 하는 비트의 수 d'를 지역 깊이라고 한다.
  • d'와 전역 깊이 d가 같은 버킷에서 오버플로우 날 경우 디렉터리 배열 내의 엔트리 수는 2배가 되며, 어떤 키를 삭제한 뒤 모든 버킷이 d>d'인 경우 엔트리 수는 절반이 된다.
  • 대부분의 키 검색은 디렉터리와 버킷에 대한 블록 접근을 필욯로 한다.
장점
  • 파일의 크기가 크더라도 레코드를 접근하기 위해 디스크 접근이 두 번을 넘기지 않는다.
  • 인덱스의 크기가 작아 메모리를 절약할 수 있다.
단점
  • 각각의 인덱스가 실제의 버킷을 포인트하므로 데이터의 숫자가 적으면 되려 디스크가 낭비된다.
  • 버킷을 인덱스를 통해 간접적으로 검색하므로 추가적인 검색이 필요하다.

보안 분야에서의 해싱[편집]

보안(security) 분야에서의 해싱은 데이터 무결성, 메시지 인증에 사용된다. 임의의 길이의 비트열을 입력 받고 고정된 길이의 해시 코드를 생성해 암호학적으로 풀 수 없는 키를 만들어낸다. 위변조를 막기 위한 전자 서명이나 부인 방지를 위해 사용되며 그 예시로는 MD4, MD5, RIPEMD, SHA 등이 있다.

각주[편집]

  1. 개발자 카니, 〈해싱〉, 《티스토리》, 2018-02-05

참고자료[편집]

  • 개발자 카니, 〈해싱〉, 《티스토리》, 2018-02-05

같이 보기[편집]


  검수요청.png검수요청.png 이 해싱 문서는 블록체인 기술에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.