[C]해시(hash)
1️⃣ 해시
(1) 해시 vs 암호화
- 중요한 정보를 저장할 때는 누구나 볼 수 없게 암호화를 해야합니다. 예를 들면 로그인을 할 때비밀번호를 암호화시켜서 가리고 특별한 key를 이용해야지만 비밀번호를 볼 수 있게 하는 방법입니다.
- 이때문에 암호화는 특별한 key만 가지고 있다면 역으로 비밀번호를 알 수 있기 때문에
양방향성 의 성질을 가지고 있습니다. 그러나 이 때문에 특별한 key를 잃어버리면 그 데이터베이스의모든 비밀번호 가 해킹당하게 됩니다.
- 해시값에 대해 좀 더 자세히 설명하자면
해시 함수 에게 어떤 데이터를 대표하는 값 내놓으라 하고 받은 값이 해시 값입니다. 해시 함수 는임의의 크기 를 가진 데이터를고정 크기 의 값에 대응하게 하는 함수를 말합니다.
(2) 해시의 취약점(rainbowtable, salt)
- 하지만 rainbowtable라는 특정 해쉬함수에 대해
데이터 와 그에 대응하는 해쉬값을 연결한 테이블이 생기게 되었고 이로인해 해쉬값을 이용하여데이터 를 해킹할 수 있게 됩니다. - 이런것을 막기위해 생긴 것이 salt인데 입력값으로
데이터 를 넣어줄 때 그데이터 값에 특별한salt 값을 붙여서 해쉬함수에 넣어주는 원리입니다. - 이러한 salt를 이용한다면 단순한 비밀번호(데이터)일지라도 해쉬값으로
역추적 하기는 쉽지 않게될 것입니다. - 참고하면 좋을 영상 >>>>>노마드 코더 - 해시함수 5분설명
2️⃣ 해시 테이블
(1) 해시 테이블 특징
해시 테이블 이란 해시함수를 사용하여 생성한 해시값을 색인(index)로 삼아 키(key)와 데이터(value)를 저장하는 자료구조를 말합니다.- 기본연산으로는 탐색(search), 삽입(insert), 삭제(delete)가 있습니다.
- 주로 효율적인 검색에 활용되기 때문에 리소스보다 속도를 추구합니다.
- 값을 저장하는 방법은 여러가지가 있지만
해시 테이블 의 평균시간 복잡도 는 검색, 삽입, 삭제에서O(1) 로 가장 빠른 편입니다. 단순히 배열을 이용하여 값이 있으면 1, 없으면 0을 저장하는 방법은
숫자가 커질경우 메모리적으로비효율 적이고보안에도 취약 합니다.- 해쉬테이블의 종류는 여러가지이지만 가장 간단한 방법으로
색인 = 입력값 % 10
과 같이 입력값을 색인(index)으로 만듬으로써 일정범위의 크기로 만들 수 있습니다. - 하지만 이러한 방법의 경우
중복 의 경우가 있는데 다음과 같은 방법으로 줄일 수 있습니다.체이닝(Chaining) : 색인(index)가 같은 것끼리 체인으로 연결시키는 방법 (연결리스트 이용)
- 그러나 체이닝(Chaining)방식 또한 특정 색인(index)만 사용되어 이미 확복해둔 리소스의 손실이 일어나게되어 좀 더효율적인 방법을 찾게 됩니다.
선형 탐색(Linear Probing) : 중복될 경우 다음 빈칸에 데이터를 저장하는 방식
- 선형 탐색(Linear Probing)방식은 이미 확보해둔 Bucket을 먼저 소모시켜 리소스적으로 효율을 높일 수 있습니다.
- 참고하면 좋을 영상 >>>>>코딩하는거니 - 해시테이블
- 그밖의 충돌방지방법에 대해 알고싶다면 >>>>>배하람블로그-해시 테이블
(2) 연결 리스트를 사용한 해시 테이블(chaining)
연결 리스트 를 사용하여 해시 테이블을 만들면색인이 중복 되더라도 각 색인에 해당하는 값이 추가될 때마다노드 를 추가해주면 됩니다.- 자세한 내용은 다음 포스트에서 정리하도록 하겠습니다.
>>>>>연결리스트로 해시테이블 만들기