해쉬충돌에 대해서 설명하고 방지하는 방법에 대해서 알아보자.

SionBackEnd·2023년 2월 21일
0

해쉬 충돌

해쉬 충돌이란 key는 다른데 hash가 같을때 또는 key와 hash도 다른데 hash % map_capacity로 모듈러 연산결과가 같을 때 발생합니다.

해결방법

open Adrressing의 linear probing) 과 separate chaining방법이 있습니다.
자바에서는 separate chaining 방식을 이용합니다.

Open Addressing은 데이터를 삽입하려는 해시 버킷이 이미 사용 중인 경우 다른 해시 버킷에 해당 데이터를 삽입하는 방식이다. 데이터를 저장/조회할 해시 버킷을 찾을 때에는 Linear Probing, Quadratic Probing 등의 방법을 사용한다.

Separate Chaining은 동일한 버킷의 데이터에 대해 자료구조를 활용해 추가 메모리를 사용하여 다음 데이터의 주소를 저장하는 것이다. 자바 8에서는 linkedList와 tree를 이용합니다. 그중에서도 레드 블랙 트리를 이용합니다.

자바8에서 separate chaining 방식에서 알아두면 좋을 정보

링크드 리스트를 사용할 것인가 트리를 사용할 것인가에 대한 기준은 하나의 해시 버킷에 할당된 키-값 쌍의 개수이다. 예제 5에서 보듯 Java 8 HashMap에서는 상수 형태로 기준을 정하고 있다. 즉 하나의 해시 버킷에 8개의 키-값 쌍이 모이면 링크드 리스트를 트리로 변경한다. 만약 해당 버킷에 있는 데이터를 삭제하여 개수가 6개에 이르면 다시 링크드 리스트로 변경한다. 트리는 링크드 리스트보다 메모리 사용량이 많고, 데이터의 개수가 적을 때 트리와 링크드 리스트의 Worst Case 수행 시간 차이 비교는 의미가 없기 때문이다. 8과 6으로 2 이상의 차이를 둔 것은, 만약 차이가 1이라면 어떤 한 키-값 쌍이 반복되어 삽입/삭제되는 경우 불필요하게 트리와 링크드 리스트를 변경하는 일이 반복되어 성능 저하가 발생할 수 있기 때문이다.

참조 사이트
https://d2.naver.com/helloworld/831311

profile
많은 도움 얻어가시길 바랍니다!

0개의 댓글