본문 바로가기
개발 공부/Java

해시 정리 (Hash)

by 코딩호야 2025. 5. 29.

1. 해시(Hash)란?

고정되지 않은 길이의 데이터를 고정된 길이의 데이터로 바꾸는 함수

 

해시 특징

 

특징                                             설명

고정 길이 어떤 길이의 입력이든 출력은 일정한 길이
빠른 계산 매우 빠르게 변환됨
충돌 가능성 있음 서로 다른 입력이 같은 출력값이 될 수 있음 (→ 충돌)

 

 

2. 해시 테이블(Hash Table)

- 해시 테이블(Hash Table)

해시를 사용해서 (Key -> Value) 쌍을 저장하는 자료구조

빠르게 찾기 위해 해시 함수를 사용하고, 그 결과값에 따라 버킷(Buket)에 데이터를 저장하는 구조입니다.

 

- 버킷

해시 함수를 결과값(해시코드)을 기반으로 계산된 인덱스에 위치한 저장 공간이다.

해시 테이블은 내부적으로 배열로 구성되어있고 그 배열의 각 칸이 하나의 버킷입니다.

 

버킷에 데이터가 저장되는 구조

[버킷0] → null
[버킷1] → null
[버킷2] → {"banana": "바나나"}
[버킷3] → null
[버킷4] → {"melon": "멜론"}
[버킷5] → null
[버킷6] → {"apple": "사과"} → {"mango": "망고"}  ← 충돌 발생 시 체이닝 구조

 

 

3. 해시 충돌(Hash Collision)

서로 다른 Key들이 같은 해시값으로 매핑되는 현상

 

예:

  • "apple" → 456 → 인덱스 6
  • "banana" → 466 → 인덱스 6

→ 둘 다 같은 인덱스를 사용하려고 하면?
충돌 발생

 

Java HashMap 충돌 처리

1. 동일 인덱스에 두 개 이상의 key 저장-> LinkedList에 연결

2. 연결 리스트가 너무 길어짐 -> Tree로 변경

3. 그로 인해 검색 속도 저하를 최소화

 

해시 테이블의 시간복잡도

평균 시간복잡도 -> O(1) 상수 시간( 입력 크기와 상관없이 항상 일정한 시간 )

최악 시간복잡도 -> O(n) 선형 시간( 입력 크기만큼 반복 )

 

 

자바 Hash 내부 구조 요약

 

요소                      설명

해시 함수 key -> 정수 해시코드 생성
배열 여러 개의 버킷을 담는 저장소
버킷 실제 데이터(Key-Value)를 저장하는 공간
충돌 처리 같은 버킷에 여러 데이터가 들어올 경우, LinkedList or Tree로 연결

 

요약

해시테이블은 Key를 해시함수로 변환해 인덱스를 계산하고, 그 인덱스에 해당하는 "버킷"에 데이터를 저장하는 구조입니다.

버킷은 충돌이 발생한 경우 내부의 여러 데이터를 리스트나 트리로 연결하여 저장할 수 있고, 충동 처리 구조에 따라 성능이 달라집니다.