8강 / 20강
해시 — 뒤지지 않고 곧바로 꺼내기
장바구니 · 세션 · 중복 주문 방지의 공통 재료
1강 마지막에 봤던 그 "10년 차 관리자의 지도"를 기억하나요? 상품 코드를 보고 어느 칸인지 바로 아는 방법. 그 정체가 해시(hash)입니다.
원리는 놀랄 만큼 단순합니다.
넣을 때 계산해서 7번 칸에 넣었으니, 찾을 때도 같은 계산을 하면 7번 칸입니다. 목록을 뒤질 필요가 없어요. O(1) — 데이터가 100만 개여도 계산 한 번.
딕셔너리 조회는 데이터가 몇 개든 항상 같은 속도입니다.
Python
브라우저에서 실행
해시 함수가 하는 일
글자를 숫자로 바꾸고, 칸 수로 나눈 나머지를 씁니다. 정말 이게 전부예요.
글자를 더하고, 나머지를 구한다. 그것이 해시 함수입니다.
Python
브라우저에서 실행
🎮 해시 실험실
열쇠를 넣으면 글자합 → 나머지 → 칸 번호 계산 과정이 단계별로 보입니다. 칸 수를 줄여 보세요. 서로 다른 열쇠가 같은 칸에 들어가는 충돌(collision)이 일어납니다. 그때 어떻게 처리하는지도 함께 보여 줍니다.
실전 ① — N+1 문제 해결하기
4강에서 예고했던 그 문제입니다. 주문 목록에 상품 이름을 붙여야 해요.
실무에서 가장 자주 쓰이는 최적화입니다. 꼭 실행해 보세요.
Python
브라우저에서 실행
실전 ② — 중복 주문 잡아내기
손님이 결제 버튼을 두 번 눌렀습니다. 같은 주문이 두 건 들어왔어요. 어떻게 걸러낼까요?
set() 하나로 중복 주문을 O(n)에 걸러냅니다.
Python
브라우저에서 실행
해시로 못 하는 일
- 범위 검색 — "1만~3만 원 상품"은 해시로 못 합니다. 해시는 순서 개념이 없어요. 이런 건 정렬 + 이진 탐색(5강)이나 DB 인덱스입니다.
- 정렬된 순회 — 딕셔너리를 가격순으로 돌 수 없습니다. 꺼내서 정렬해야 해요.
- 부분 일치 — "이어폰이 들어간 상품"도 안 됩니다.
"정확히 이 열쇠"를 찾을 때만 O(1)입니다. 그 대신 그건 압도적으로 빠릅니다.
🤔 확인 문제
상품 20,000개 목록에서 주문 2,000건의 상품 이름을 채워야 합니다. 가장 빠른 방법은?
해설 딕셔너리를 만드는 데 O(n), 조회는 각 O(1) → 총 22,000걸음. 선형 탐색 반복은 4,000만 걸음, 이진 탐색도 정렬 비용이 듭니다.
🤔 확인 문제
해시 테이블에서 충돌이란?
해설 칸 수는 유한하고 열쇠는 무한하니 충돌은 피할 수 없습니다. 체이닝이나 개방 주소법으로 처리하고, 충돌이 잦아지면 칸 수를 늘립니다(rehash).
🤔 확인 문제
다음 중 해시(딕셔너리)로 해결할 수 없는 요구는?
해설 해시는 순서 개념이 없어 범위 검색을 못 합니다. 범위가 필요하면 정렬된 구조 + 이진 탐색(=DB 인덱스)을 쓰세요.