Hash 의 정의 : 해시
는 데이터를 다루는 기법
Hash 값 이란 : 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑(mapping)한 값이다
해시를 통한 데이터 저장시에는 검색과 저장이 아주 빠르게 진행
무결성
해시를 통해 무결성을 지킬 수 있는 이유?
=> 해시는 특정한 데이터를 상징하는 고정된 길이의 데이터로 변환하게 된다.
여기서 상징 이터는 원래의 데이터가 조금만 달라져도 확연하게 달라지는 특성 가지고 있어 무결성을 지키는 데에 많은 도움을 준다.
EX) 'A'라는 문자열의 해시와 'B'라는 문자열의 해시는 고작 한 알파벳이 다를뿐이지만 해시 결과값은 완전히 다른 문자열이 나오게 된다.
보안성
해시는 기본적으로 복호화가 불가능 하다는 특징이 있다.
=> 이는 당연히 입력 데이터 집합이 출력 데이터 집합을 포함하고 있으므로, 특정한 출력 데이터를 토대로 입력 데이터를 찾을 수 없기 때문이다.
즉, 동일한 출력 값을 만들어낼 수 있는 입력 값의 가짓수는 수학적으로 무한개라고 볼 수 있다.해시는 애초에 복호화를 수행할 수 없도록 설계되었으며, 실제로도 해커가 쉽게 복호화를 할 수 없다는 점에서 강한 보안성을 가진다.
Hash 함수란?
정의 : 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 단반향성 함수/알고리즘 이다.
사용 용도
알고리즘 예
MD5
SHA
자바의 haschCode()
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence{
private final char value[];
public int hashCode(){
int h = hash;
if(h == 0 && value.length > 0){
char val[] = value;
for(int i =0; i < value.length; i++){
h = 31*h + val[i];
}
hash = h;
}
return h;
}
}
String.java의 경우, hashCode()를 재정의하여 사용 하고 있다.
=> 계산 방법 : hashcode = s[0]31^(n-1) + s[1]31^(n-2) + ... + s[n-1]
방법으로 hashcode를 계산한다. ( s[0]는 문자열의 0번 Index의 char 이다. )
위의 그림처럼 정렬된 배열에 새로운 값을 추가하게 될 경우
과정)
삽입할 위치를 이진 검색으로 조사한다.
인덱스 번호 6번 인덱스 요소 부터 모두 한칸씩 뒤로 이동한다.
6번째 인덱스에 값을 대입한다.
=> 위와 같은 과정을 통해
이진 탐색 O(log n)
요소 이동 O(n)
⇒ 결국 O(n) 시간복잡도를 가지게 된다.
해시를 이용하면
과정)
키값을 가지고 해시함수를 통해 해시값을 구한다.
구한 해시값을 인덱스 위치로 데이터를 추가한다.
위와 같은 과정으로
요소 삽입 O(1)
⇒ O(1) 시간복잡도를 가지게 된다.
해시를 사용함으로써 이전 배열에 데이터를 삽입시 한칸씩 뒤로 옮겨야 하는 과정이 생략 되어 더 빠르게 데이터의 처리를 할 수 있다.
정의 : 충돌(Collision) 은 서로 다른 문자열이 Hash function을 통해 Hash 한 결과가 같은 경우 (중복되는 경우)이다.
⇒ 위의 그림에서처럼 저장할 버킷이 중복되는 현상을 충돌 이라고 한다.
해시 충돌의 문제점
충돌이 많아질 수록 같은 해시값의 데이터들에서 찾아야할 데이터를 찾는 과정이 추가되어
시간 복잡도가 O(1)에서 O(n)에 가까워지기 때문에
⇒ 충돌이 적을 수록 좋은 해시 함수가 된다.
충돌의 해결 방안 (대표적인 2가지 방법)
Chaining 기법 정의: 체이닝 기법은 동일 해시 값을 갖는 데이터를 쇠사슬 모양처럼 연결 리스트를 통해 관리하는 방법이다
장점
한정된 저장소(Bucket)을 효율적으로 사용가능 ( 정해진 Bucket범위만 사용 함 )
해시 함수를 선택하는 중요성이 상대적으로 적음.
상대적으로 적은 메모리를 사용. 미리 공간을 잡아 놓을 필요가 없다.
단점
해시 함수의 퀄리티에 따라서 한 주소에 쏠림 현상이 발생할 수 있다.
성능이 좋지 않은 해시 함수로 인해 동일 주소에 여러 값이 들어가는 경우
=> 선형 구조에서의 탐색 시 최악의 경우 O(N)의 시간복잡도를 갖게 되어 탐색이 빠르다는 해시 테이블의 장점이 퇴색된다.
Open Addressing 기법 정의 : 열린 주소 기법은 동일된 해시 값으로 충돌이 날 경우 일정 변수값을 더하여 재해싱을 통해 데이터를 저장하는 방법이다.
재해싱 종류
장점
단점