오늘 뭐했냐/개발에 대한 주저리

23. 06.22 자료구조 5. 해시 테이블(Hash table)

스스로에게 2023. 6. 22. 18:56

 해시 테이블은 키값으로 이루어진 자료 구조 중 하나로 해싱을 통해 해시값을 만들고 이게 키가 되어 저장을 데이터를 저장하는데 해싱이란 해쉬 함수라는 특별한 함수를 통해서 고정된 길이의 값으로 만드는 것을 말한다. 이것은 마치 내가 배우는 자바스크립트에서 배열을 저장하는 방식과 유사하며 배열을 조사할 때 잠깐 언급이 되었다. 자바스크립트는 배열이 인덱스값과 데이터값이 같이 가지고 있는 것이 아니라 배열은 인덱스의 주소들을 가지고 있고 그 인덱스의 주소로 가면 각 인덱스가 참조될 값의 주소를 가지고 있는 방식이다. 이게 마치 해시 테이블에서 해싱을 통해 해시값을 확인해 찾아가는 것과 비슷하다. 해시 테이블의 내부 구조는 배열처럼 이루어져있다.

 의문이 들었다 배열과의 차이가 뭘까. 배열은 인덱스를 알고 있다면 빠르게 접근할 수 있다. 하지만 인덱스를 모른다면 하나씩 다 찾아봐야하는 단점이 있다. 그리고 인덱스를 알고 있다고 해도 그 인덱스는 고정값이 아니라서 바뀔 수도 있다. 하지만 해시테이블은 특정 데이터를 해쉬 함수로 구분해 저장하기 때문에 내가 찾으려는 데이터가 뭔지 안다면 빠르게 접근할 수 있다. 다만 해시 함수를 통해 나온 해시값이 중복될 경우 충돌이 발생하는 문제가 생긴다. 이를 해결하기 위한 여러 방법들이 있지만 일단 해시 테이블이 70~80%만 사용되고 있어도 충돌이 빈번하게 일어난다고 하니 용량 관리에 있어서는 효율적이지 못하다. 하지만 반대로 빈 공간이 항상 있다면 헤시 테이블은 좋은 방법이 될 것 같다. 그리고 해싱 함수를 활용해 암호화도 가능하지 않을까 하는 생각이 든다. 물론 그렇게 암호화를 하면 시간은 더 오래 걸리니 얻는 게 있으면 잃는 것도 있다.