8강 / 20강

해시 — 뒤지지 않고 곧바로 꺼내기

장바구니 · 세션 · 중복 주문 방지의 공통 재료

해시 — 뒤지지 않고 곧바로 꺼내기
값을 계산해서 보관할 칸 번호를 바로 구한다. 그래서 찾을 때도 계산 한 번이면 끝입니다.

1강 마지막에 봤던 그 "10년 차 관리자의 지도"를 기억하나요? 상품 코드를 보고 어느 칸인지 바로 아는 방법. 그 정체가 해시(hash)입니다.

원리는 놀랄 만큼 단순합니다.

🔑
열쇠
"ORD-0042"
🧮
계산
해시 함수 → 7
🗄️
7번 칸
거기에 넣고, 거기서 꺼냄

넣을 때 계산해서 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건의 상품 이름을 채워야 합니다. 가장 빠른 방법은?
🤔 확인 문제
해시 테이블에서 충돌이란?
🤔 확인 문제
다음 중 해시(딕셔너리)로 해결할 수 없는 요구는?