Home [CS] Hash의 개념과 사용 예시
Post
Cancel

[CS] Hash의 개념과 사용 예시

개요

안녕하세요.

이번 글에서는 해시(Hash)의 개념과 사용 예시에 대해 간단하게 살펴보겠습니다.


해시의 개념

해시? 어디서 들어는 본 것 같은데…

위키백과에서는 해시를 "임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수" 라고 정의하고 있습니다.

해시(Hash)와 해시 함수(Hash Function)는 동일한 의미로 사용되므로 이후에는 해시라는 용어로 통일하겠습니다.

위의 정의는 다음의 그림을 통해 간략하게 파악할 수 있습니다.

해시 그림 [그림01] 해시 그림


해시의 특징

그렇다면 해시는 어떤 특징을 가지고 있을까요?

1. 1개의 출력은 1개의 입력에서만 생성 (여러 입력이 동일한 출력 불가능)

1개의 출력은 1개의 입력에서만 생성되어야 합니다.

이는 1개의 입력에서 1개의 출력만 생성되는 것과 일치합니다.

2. 해시 충돌 예방

하지만 해시가 만들어내는 출력값 경우의 수보다 해시에 입력의 수가 더 많거나 해시 함수의 문제로 2개 이상의 입력이 동일한 값을 출력할 수 있습니다.

해시 충돌 원인 중 하나: 출력값 경우의 수보다 많은 입력의 수 [그림02] 해시 충돌 원인 중 하나: 출력값 경우의 수보다 많은 입력의 수

이렇게 해시의 출력이 같은 현상을 해시 충돌(Hash Collision)이라고 합니다.

따라서 해시는 이러한 해시 충돌을 방지하기 위해 크게 2가지 방법을 사용합니다.

A. 개방 주소법(Open Address)

  • 충돌이 없을 때까지 반복
  • 삽입 삭제의 오버헤드 적음
  • 새로운 탐색을 위해 계산식 필요(선형탐사법(Linear Probing), 제곱탐사법(Quadratic Probing), 이중 해싱(Double Hashing) 등)

B. 체이닝(Chaining)

  • 충돌 해시에서 연결 리스트 생성 후 저장
  • 선형 시간 증가
  • 추가 저장공간 필요

다음 그림은 해시를 활용한 해시 테이블 구조에서의 해시 충돌 방지 그림입니다.

해시 충돌 방지 [그림03] 해시 충돌 방지

3. 출력 -> 입력 확인이 계산적으로 불가능

또다른 특징으로는 출력 값으로부터 입력 값의 확인이 계산적으로 불가능하다는 점입니다.

연산 능력이 발전하면서 파훼된 초기 해시 알고리즘 역시 존재합니다.


해시의 사용 예시

실제로 해시는 어떻게 사용되는지 간단히 확인해보겠습니다.

해시 테이블: 키와 값의 쌍으로 저장된 데이터 구조

앞에서도 잠깐 언급했지만, 해시 테이블이라는 데이터 구조에 사용됩니다.

키와 값을 쌍으로 하는 데이터 구조로 해시 함수를 이용해 키에서 값을 매칭시킵니다.

해시 테이블은 C++의 std::hash, Java의 java.util.HashMap, Python의 dictionary 등 다양한 언어에서 기본적으로 제공되고 있습니다.

암호화: 보안의 기본 개념

해시는 평문을 암호문으로 변환하는 암호화(encryption) 중 단방향 암호화로 사용됩니다.

예를 들어 비밀번호를 DB에 저장한다고 가정하겠습니다.

비밀번호를 그대로 저장하는 대신 비밀번호를 입력한 해시의 출력값을 저장한다면 어떨까요?

DB의 유출과 같은 사건이 발생한다면 그대로 저장했을 경우 그대로 노출됩니다.

반면 해시의 출력값을 저장했다면 이를 통해 원본 비밀번호를 알아내는 것은 사실상 불가능에 가까우므로 비교적 위험이 덜합니다.

글의 작성 시점을 기준으로 SHA-256 알고리즘이 가장 널리 사용되고 있습니다.

무결성 검증: 하나의 입력 -> 하나의 출력

무결성을 검증하기 위한 방안으로도 활용됩니다.

현재 작성자의 부서에서도 해시를 활용해 파일의 무결성을 검증하고 있습니다.


마무리하며

이 글에서는 해시의 개념이 어떠한 것인지, 어떤 특징을 가지고 있는지, 어떻게 활용되고 있는지에 대해 간략하게 알아보았습니다.

현재 글의 키워드 중심으로 검색해보신다면 보다 상세한 내용까지 확인하실 수 있습니다!

조언과 댓글은 언제나 환영입니다.

그럼 다음 글에서 뵙겠습니다.

감사합니다. 😀


참고 문헌

This post is licensed under CC BY 4.0 by the author.

[Gibhub Action] Chirpy 업데이트 및 오류 해결

[Python] Dictionary

Comments powered by Disqus.