프로젝트를 했을때 JWT 로 유저들의 회원가입을 구현을 했었었다. 그리고 회원가입을 하면 우리는 유저가 입력한 아이디와 비밀번호를 DB에 저장했지요.
입력받은 데이터를 그대로 저장하면 어떻게 될까요 ?
암호화 되어있는게 없기 때문에 개인정보 유출이 된다 ㅎㄷㄷ;
그러니까 우리는 비밀번호를 저장할때 암호화해서 저장해야한다. 해시 함수를 활용해서 저장을 하면 되겠쥬 ? 😉
- Node.js 에 내장되어있는 crypto , brypto 내장 모듈을 이용
해시 함수는 나중에 따로 정리할 수 있으면 정리하겠다. 오늘은 해시 테이블을 알아볼게용!
자, 그래서 해시 테이블이 뭘까요 ?
해시 테이블은 해시 함수를 활용해서 키 값에 인덱스를 배정하고, 인덱스의 값에 데이터를 넣는 자료 구조 입니다.
*해시
: 키와 값이 한쌍으로 구성된 데이터
해시 테이블의 아이디어는 직접 주소 테이블 이라는 자료구조에서 출발합니다.
*직접 주소 테이블
: 입력받은 value가 곧 key가 되는 데이터 매핑 방식
class DirectAddressTable {
constructor () {
this.table = [];
}
setValue (value = -1) {
this.table[value] = value;
}
getValue (value = -1) {
return this.table[value];
}
getTable () {
return this.table;
}
}
const myTable = new DirectAddressTable();
myTable.setValue(7);
myTable.setValue(20);
myTable.setValue(50);
console.log(myTable.getTable());
⬆️⬆️⬆️⬆️ 위 코드를 실행하면 위에 결과값을 볼 수 있다. ⬆️⬆️⬆️⬆️
이 말이 어떤 말이냐면 7
을 테이블에 넣으면 이 값은 배열의 7번 인덱스
의 요소가 되고 50
을 넣으면 50번 인덱스
의 요소가 된다는 말이다.
그러면 직접 주소 테이블
을 사용할 때는 들어오는 값을 알면 저장된 인덱스도 함께 알 수 있기 때문에 시간 복잡도는 O(1)
이다. 또한 테이블에 있는 값을 삽입
, 수정
, 삭제
할 때도 값이 어디 있는지 알고 있기에 O(1)
로 해결이 가능하다.
하지만 인덱스와 시간 복잡도를 공부하면 O(1) 로 삽입
, 수정
, 삭제
를 할때는 공간의 효율성이 좋지 못한걸 알 수 있다.
그렇기에 저장해야 할 값의 범위가 크지 않은 데이터를 저장할 때 직접 주소 테이블을 사용하면 좋을것이다.
해시 함수로 보완하자
- 직접 주소 테이블의 공간 효율이 좋지 않다는 단점을 보완한게
해시 테이블
이다.
1) 1000 이라는 값이 들어가게 되면 1000번 인덱스에 값을 저장하기 위해 1000의 크기를 가진 테이블을 생성해야함
2) 나머지 999 개의 버리는 공간이 발생
function hashFunction (key) {
return key % 10;
}
console.log(hashFunction(102948)); // 8
console.log(hashFunction(19191919191)); // 1
해시 테이블은 직접 주소 테이블과 같이 값을 바로 테이블의 인덱스로 사용하는 것이 아니라 해시 함수라는 것에 한번 통과시켜 사용
*해시 함수
: 입력받은 데이터가 인덱스를 받을 수 있도록, 매핑하는 함수
이때 함수가 뱉어내는 결과물을 해시라고 부른다
key 값을 10으로 나눈 후의 나머지를 반환하는 것이다. 다만 어떤 값이 들어오던지 1 의 자리만 반환하여 0~9 사이의 값
이 나온다.
자 이렇게 사용하게 되면 고정된 테이블의 길이를 정해둘 수 있고 그 안에만 데이터를 저장할 수 있게 되어 공간 낭비를 줄일 수 있게 된다.
2편에서 계속 ... 총총 ...