게임 개발을 하다 보면 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)

✍️ 한 줄 정리

해시는 “데이터를 찾는 것”이 아니라
“데이터 위치를 계산해서 바로 접근하는 방식”이다.

+ Recent posts