1.용어
Hash, HashFunction, Hashing
해시는 데이터를 효과적으로 저장할 수 있는 방법인 자료구조와 밀접하게 맡닿아 있는 명사이다. 그러므로 Hash라는 값을 이해하고자 위와 같은 몇가지 용어에 대한 이해가 선행해야 한다.
바로 Hash, HashFunction, Hashing이다.
여기 Happy란 단어가 존재한다. 이 단어는 5글자 이기 때문에 05란 값에 대응하게 변환시키는 경우를 생각해보자.
위의 예시에서 Hash는 변환한 05라는 숫자를 말하며 HashFunction은 Happy라는 인풋에서 05라는 아웃풋을 얻게 만들어낸 알고리즘을 활용한 함수를 말하며 이런 일련의 과정이 Hashing이다.
좀더 구체적으로 보자
Hash란 방금 예시에서 임의의 길이의 데이터를 고정된 길이의 데이터인 05로 매핑했는데 매핑된 값을 말한다. 또다른 단어인 Sad란 값이 들어오면 저 예시에서는 글자수대로 정수로 바꾸는 알고리즘을 가졌기에 03과 대응시킬 것이고 따라서 임의의 값이 고정된 정수로 변환되는 것이다.
HashFunction은 다양한 길이의 Input을 고정된 길이의 output으로 만든 행위를 말한다. 위의 예시에서 임의의 데이터 값을 05 혹은 03이라는 고정된 정수로 변환하고 있는데 이 행위를 HashFunction이라 말한다. 이를 통해 다양한 가변적인 데이터 값은 알고리즘을 통해서 통일성있게 일정한 데이터로 변환된다.
Hashing은 앞서 말한 일련의 데이터 변환 과정을 말한다 Happy라는 값을 변환해 05라는 데이터로 변환한 일련의 행위를 Hashing이라 지칭한다.
2.특징
보안성 - 해시함수를 알고있지 않는한 전혀 모르는 타인은 05라는 해시만을 가지고 happy라는 값으로 변환해 낼 수 없다. 조금 어렵게 말하자면 입력 데이터 집합이 출력 데이터 집합을 포함하는 관계이며 그렇기 때문에 출력 데이터 만을 가지고 입력 값을 판단해 내는 복호화가 불가능 하다는 특징을 가지고, 이런 해시의 특징 때문에 BlockChain이나 암호화에 사용된다.
무결성 - 임의의 데이터들을 해시함수를 통해 고정된 값으로 변환하며 실제 해시함수는 입력 데이터가 조금만 달라져도 출력 데이터가 확연하게 달라지는 특성을 가지고 있다. 이런 특징 때문에 데이터의 무결성을 지키는데 도움이 된다. 데이터의 중복 가능성이 낮기 때문이다.
해시함수의 효율성 - 해시함수는 크게 자원을 소모하지 않은 알고리즘을 기반으로 구현되기 때문에 CPU나 Memory에 대한 사용도가 크지 않고 이는 효율적인 컴퓨터 자원관리를 가능하게 한다.
3. Hash의 쓰임새
HashTable
Hash의 이런 무결성, 효율성이란 특징을 활용해 시간복잡도 O(1)에 수렴하는 자료구조를 만들어 사용할 수 있는데 이를 HashTable이라고한다.
Hash의 값은 중복되기 힘들다는 무결성의 특징을 가지고 있다. 그렇기 때문에 Input을 Key값으로 가지고 있고 이를 해시로 만들어 해당 Hash를 Array배열의 주소값으로 가지고 있고 인풋과 관련된 값을 Array의 Value로 가지는 값을 생각해보자.
즉 다음 테이블과 같은 구조를 가진 데이터를 생각해 볼 수 있다.
Key | Value |
Happy | 치킨 |
Sad | 운동 |
그렇다면 위의 예시에서 사용했던 글자수 대로 정수로 만드는 HashFunction을 가져와 지금 적용해본다면,
CPU와 메모리의 자원을 많이 사용하지 않는다는 HashFunction의 효율적인 특징을 활용해
Happy인 05를 Array주소값으로 치킨이란 Value를 넣고 Sad인 03 Array 주소값으로 운동이란 Value값을 가지고 있는 자료구조를 만들어 낼 수 있다.
이런 자료구조 상태일때 Happy값이 필요하다면 배열의 05번째 주소값의 Value값에 바로 접근 가능하다.
시간복잡도가 O(1)인 굉장히 효율적인 자료구조인 것이다.
암호화
HashFunction으로 만들어진 출력값들은 출력값만을 가지고선 입력값을 판단해내기 어렵다는 특징인 보안성특징을 가지고있다. 이 특징을 활용해 HashFunction을 수학적으로 복호화하기 어려운 소수 소인수분해값등을 활용한 RSA같은 방식을 활용해 HashFunction을 만든다면 복호화가 불가능하고 이와같은 방식을 활용해서 Password의 Hash값들을 DB에 저장할 수 있게 된다.
또한 이러한 특징으로 인해 블록체인에서 지갑의 암호로 활용되기도 하는등 우리의 실생활에서 이미 Hash는 정말 많은 곳에서 활용되고있다.