Kotlin/코틀린 해시(Hash) 완벽 가이드 – 개념, 면접 포인트 정리

✨ 개요

해시(Hash)는 임의 길이의 입력 → 고정 길이의 값(해시값) 으로 매핑하는 기술입니다.
빠른 조회(해시테이블), 데이터 무결성(체크섬), 보안(비밀번호 해싱/디지털서명), 분산시스템(일관 해싱) 등 소프트웨어 전 영역에서 핵심이에요.


1. 요약


2 해시의 정확한 정의

충돌(Collision)은 원천적으로 존재(비둘기집 원리). 목표는 충돌을 드물고 예측 불가하게 만드는 것.


3 해시함수의 종류


4. 해시테이블 동작 원리 (핵심)

  1. 버킷 인덱싱: index = H(key) mod capacity
  2. 충돌 해결
    • 체이닝(Chaining): 같은 인덱스에 연결리스트/트리로 쌓음 (Java 8+: 일정 길이 넘으면 트리화)
    • 개방주소(Open Addressing): 빈 칸을 찾을 때까지 선형/제곱/이중 해싱으로 탐사
  3. 부하율(Load Factor): size / capacity가 임계치(예: 0.75) 넘으면 리사이즈 + 리해시
  4. 시간복잡도
    • 평균: 조회/삽입/삭제 O(1)
    • 최악: O(n) (충돌 집중/적대 입력) → 좋은 해시 + 적절한 용량/부하율 관리가 필수

Java/Kotlin: equals()가 같다면 반드시 hashCode()도 같아야 함. 둘 중 하나만 오버라이드하면 HashMap/HashSet 오동작.


5. 암호학적 해시: 왜 중요한가?


6. 비밀번호 해싱 – 절대 SHA-256 단독 사용 금지


7. 실무 체크리스트


8. 면접 포인트 정리(Q → A)

Q1. 해시테이블 시간복잡도와 최악 상황은?

Q2. 좋은 해시함수의 조건?

Q3. equals()와 hashCode()의 계약?

Q4. 비밀번호에 SHA-256 같은 빠른 해시를 쓰면 안 되는 이유?

Q5. 일관(Consistent) 해싱이 뭐고 왜 쓰나?

Q6. 생일 역설을 해시 충돌 관점에서 설명?

Q7. 개방주소법에서 클러스터링을 완화하는 방법?



Related Posts