게임 개발을 하다 보면 HashSet, Dictionary 같은 자료구조를 자주 사용하게 된다.
이때 핵심이 되는 개념이 바로 해시(Hash)다.
🔑 해시(Hash) 한 줄 정의
데이터를 빠르게 찾기 위해 값을 특정 숫자(주소)로 변환하는 방식
📦 왜 해시가 필요할까?
데이터를 찾는 가장 단순한 방법은 “하나씩 비교”하는 것이다.
list.Contains(pos);
이 방식은 데이터가 많아질수록 느려진다.
→ 시간복잡도: O(n)
반면 해시를 사용하면:
hashSet.Contains(pos);
👉 데이터를 일일이 찾는 것이 아니라
👉 계산된 주소로 바로 접근한다
→ 시간복잡도: O(1) (거의 즉시)
🧠 해시의 동작 원리
해시는 크게 2단계로 동작한다.
1️⃣ 해시 함수 (Hash Function)
데이터를 숫자로 변환한다.
예:
(3, 5) → 834729
2️⃣ 해시 테이블 (Hash Table)
그 숫자를 기반으로 저장 위치를 결정한다.
👉 즉,
데이터를 “어디에 저장할지” 미리 계산하는 것
⚡ 왜 빠를까?
일반 방식:
- 처음부터 끝까지 비교 (탐색)
해시 방식:
- 계산 → 바로 위치 접근
👉 그래서 데이터가 많아질수록 성능 차이가 크게 난다.
📊 List vs HashSet 비교
구조탐색 방식속도
| List | 순차 탐색 | 느림 (O(n)) |
| HashSet | 해시 기반 | 빠름 (O(1)) |
⚠️ 해시의 단점: 충돌 (Collision)
서로 다른 데이터가 같은 해시 값을 가질 수 있다.
(3,5) → 123
(7,2) → 123
이걸 해시 충돌이라고 한다.
👉 실제 구현에서는
- 같은 위치에 여러 개 저장하거나
- 추가 비교를 통해 해결한다
🎮 유니티에서의 해시
유니티에서 사용하는 자료형들:
- Vector2Int
- Vector3
- string
👉 이미 내부적으로 GetHashCode()가 구현되어 있다.
그래서:
HashSet<Vector2Int> occupied;
occupied.Contains(pos);
👉 별다른 작업 없이도 빠르게 동작한다.
💡 실제 사용 예 (게임 개발)
해시는 다음과 같은 상황에서 매우 유용하다:
- 이미 생성된 좌표 확인
- 중복 방지
- 빠른 존재 여부 검사
🔥 핵심 요약
- 해시는 데이터를 숫자 주소로 변환하는 기술
- 빠른 탐색을 위해 사용된다
- HashSet, Dictionary의 핵심 개념
- 성능은 거의 O(1)
✍️ 한 줄 정리
해시는 “데이터를 찾는 것”이 아니라
“데이터 위치를 계산해서 바로 접근하는 방식”이다.