해시 함수?
주어진 데이터를 고정 길이의 불규칙한 숫자로 변환하는 함수
해시 함수는 믹서기를 생각해보면 이해하기 쉽다고 한다.
데이터를 해시 함수에 넣으면 고정 길의 불규칙한 숫자를 출력한다.
해시 함수는 데이터를 분리하는 기계라고 생각하면 이해하기 쉽고,
이 불규칙한 숫자를 '해시값' 이라고 한다.
해시값은 숫자이지만 16진수로 표기하는 경우가 많다.
16진수
0~9 숫자와 A~F의 알파벳으로 이루어진 16개의 문자를 사용해서 숫자를 표현
컴퓨터는 모든 데이터를 2진수로 관리한다.
해시값도 데이터의 일종이므로 표기는 16진수로 하지만, 내부에서는 2진수로 관리된다. 실제로 해시 함수는 컴퓨터 내부에서 수치를 계산한다.
- 출력하는 값의 데이터 길이가 바뀌지 않는다.
매우 큰 데이터를 입력해도 출력되는 해시값의 데이터 길이는 바뀌지 않는다.
매우 작은 데이터를 입력해도 출력되는 해시값의 데이터 길이는 바뀌지 않는다.
- 입력이 같으면 출력도 반드시 같다.
- 비슷한 데이터를 입력해도 1비트라도 다른 데이터라면 출력이 크게 달라진다.
비슷한 데이터를 입력한다고 해서 해시값도 비슷해지지 않는다.
- 전혀 다른 데이터를 입력해도 같은 해시값이 나올 수 있는 경우가 낮은 확률로 존재한다.
- 해시값 충돌
- 해시값으로부터 원 데이터를 역산하는 것이 사실상 불가능하다.
데이터 입력과 출력의 흐름이 단방향으로 이루어지며, 이것은 '암호화' 크게 다른 점이다.
- 해시값을 결정하는 계산이 비교적 간단하다.
MD5(Message Digest Algorithm)
SHA(Secure Hash Algorithm)
알고리즘에 따라 계산 방법이 다른데, 알고리즘이 다르면 같은 데이터를 입력해도 해시값은 달라진다.
'메시지 인증 코드', '해시 테이블'에서 해시 함수를 이용한다.
사용자가 입력한 패스워드를 서버에 저장할 때도 해시 함수가 사용된다.
패스워드를 그대로 서버에 저장하면 제삼자가 저장된 패스워드를 훔쳐볼 수 있지만,
패스워드의 해시값을 생성해서 그 값만 저장해두고 사용자가 패스워드를 입력했을 때
입력한 값의 해시값을 찾아서 데이터베이스의 해시값과 비교한다.
설령 해시값이 노출됐다고 해도 해시값으로부터 원 데이터를 역산하는 것이 불가능하므로
원래의 패스워드를 알아낼 수 없다.
복제 문서 판별
버전관리나 문서 복제 등을 체크하기 위해서 해시 함수를 사용하는 경우가 꽤 많다.
해시는 모든 문자열을 일정 크기로 변환하기 때문에 모든 단어를 비교하는 것보다
속도가 비약적으로 빠르다.
검색 용도
문자를 숫자나 저장되는 주소로 치환하여 검색에 사용되는 예도 있다.
- 블록체인에서 사용되는 예
https://needjarvis.tistory.com/239
Reference
- 『알고리즘 도감』, 이시다 모리테루, 미야자키 쇼이치 - 제이펍
- 사진 출처 : 알고리즘 도감 어플
- https://yjshin.tistory.com/entry/%EC%95%94%ED%98%B8%ED%95%99-%ED%95%B4%EC%8B%9C-%ED%95%A8%EC%88%98-%EC%9E%91%EC%84%B1-%EC%A4%91