[자료구조] 테이블과 해쉬 - 3

서희찬·2021년 4월 22일
0

좋은 해쉬 함수의 조건

좋은 해쉬함수의 조건을 언급하기에 앞서
좋은 해쉬함수와 좋지 않은 해쉬함수의 차이점을 보여주겠다.

이렇듯 좋은 해쉬함수는 골고루 데이터들이 분포되어있어 "충돌" 발생 확률이 낮다.
그에 반해서 좋지 못한 해쉬함수는 데이터가 몰려있어 충돌할 확률이 높다.

이렇듯 좋은 해쉬함수를 디자인 하는 방법은 무엇일까?
정답은 없지만!

다음의 사항을 고려해서 해쉬 함수를 정의하라고 조언한다!

키의 일부분을 참조하여 해쉬 값을 만들지 않고, 키 전체를 참조하여 해쉬 값을 만든다.

즉, 키 전체를 참조하여서 보다 다양한 값의 생성을 기대할 수 있고 이로 인해 데이터들이 골고루 분포되면 그만큼 충돌확률 또한 낮아진다.

이렇듯, 좋은 해쉬함수는 "충돌을 덜 일으키는 해쉬 함수" 라고도 말할 수 있다.

자릿수 선택 방법과 자릿수 폴딩 방법

키의 특성에 따라 좋은 해쉬함수의 디자인 방법은 달라지지만 키 전체를 참조하는 방법과 관련하여 다양한 방법이 소개되고있다.

그 중 하나는

"여덟 자리의 수로 이뤄진 키에서 다양한 해쉬 값 생성에 도움을 주는 네 자리의 수를 뽑아서 해쉬 값을 생성한다"

이는 키의 특정 위치에서 중복의 비율이높거나 공통으로 들어가는 값이 있다면 이는
중요하지 않는 값이므로 제외한 값을 가지고 해쉬 값을 생성한는!!!
지극히 ! 상식적인 방법이다
이를

"비트 추출 방법"

이라고 한다.

이와는 다르게 "자릿수 폴딩"은 접는다는 뜻을 가지고 있는데
이는
27, 34, 19 는 접으면 모두 겹쳐지는데 이 합은 80으로 6자리를 모두~ 반영하여 얻은 결과이다.

이렇듯 폴딩은 종이를 접듯 숫자를 겹치게 하여 더한 결과를 해쉬 값으로 결정하는 방법이다.

해쉬 함수를 디자인할때는
무엇보다 키의 특성과 저장공간의 크기를 고려하는것이
우선이다

이제 다음 포스트에서 충돌문제의 해결책을 구해보자 !!

profile
부족한 실력을 엉덩이 힘으로 채워나가는 개발자 서희찬입니다 :)

0개의 댓글