Tech & Programming/Algorithm & Data Structure

[자료구조] Hash(해시), Hash Table(해시 테이블)

소스코드 요리사 2019. 6. 25. 23:02

1. 해시 함수(Hash Funtion)

데이터의 효율적인 관리를 목적으로 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수입니다.

이 때 매핑전 원래 데이터의 값을 키(Key), 매핑 후 데이터의 값을 해시값(Hash value) 또는 해시코드, 매핑하는 과정 자체를 해싱(hashing) 이라고 합니다.

 

해시 함수의 가장 기본적인 성질은 두 해시 값이 다르면 원래의 데이터의 값도 다르다는 것입니다.

하지만, 같은 해시값을 가지고 있더라도 원래의 데이터가 꼭 같은 것은 아닙니다.

 

해시함수의 종류 : MD1, MD4, MD5, SHS, SHA-1, HAS-160 등

 

2. 해시테이블 (Hash Table)

해시테이블(Hash) 테이블은 효율적인 탐색을 위한 자료구조로 키(Key) 를 값(Value)에 대응시킵니다.

간단한 Hash 테이블을 구현하는 방법은 아래와 같습니다.

  1. 해시 함수(hash function)으로 해시코드를 계산합니다. 
  2. 해시값(해시코드) % array_length 등과 같이 배열의 인덱스를 구한다. 물론 서로 다른 두개의 해시코드가 같은 인덱스를 가리킬 수도 있습니다.
  3. 배열의 각 인덱스에는 키(Key)와 값(Value) 로 이루어진 연결리스트를 선언합니다. 이러한 충돌 문제를 해결하기 위한 아이디어를 Chaining이라고 합니다. 충돌(Collision) 이란 서로 다른 두개의 키가 같은 해시코드를 가리키거나 서로 다른 두개의 해시코드가 같은 인덱스를 가리키는 경우를 말합니다.

따라서, 키에 상응하는 값을 찾기 위해서는 해시함수로 해시코드를 계산하고, 그 해시코드를 이용해 인덱스를 찾습니다.

그리고, 충돌에 대비하여 배열에 연결리스트를 사용하기 때문에 연결리스트를 탐색해 상응하는 키의 값을 찾아야 합니다.

 

충돌이 자주 발생한다면, 최악의 경우의 수행시간은 O(N)이 됩니다. (N은 키의 개수)

하지만, 일반적으로 해시에 대해 이야기 할 때는 충돌을 최소화하도록 잘 구현된 경우를 가정하는데 이 경우 탐색 시간은 O(1) 입니다.

 

3. Hash 구현 연습

'2. 해시테이블' 의 구현방법을 참조하여, hash를 구현 해보았습니다. 소스코드는 아래 GitHub 경로에 있습니다.

https://github.com/JunpilPark/algorithm/tree/master/hash/HashPracticeSource

 

JunpilPark/algorithm

개인적인 알고리즘 문제 해결 및 구현 연습용 repository. Contribute to JunpilPark/algorithm development by creating an account on GitHub.

github.com

 

4. 레퍼런스(Reference)

해시함수 : https://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98

 

해시 함수 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 이름을 0~15 사이의 정수값으로 매핑하는 해시 함수의 예. “John Smith”와 “Sandra Dee”라는 두 키 사이에 충돌이 존재한다. 해시 함수(hash function)는 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다. 해시 함수에 의해 얻어지는 값은 해시 값, 해시 코드, 해시 체크섬 또는 간단하게 해시라고 한다. 그 용도 중 하나는 해시 테이블이라는 자료구조에 사용되며, 매우 빠른 데이터

ko.wikipedia.org

해시함수의 종류 : http://blog.naver.com/PostView.nhn?blogId=nologout&logNo=220958739809

 

해시함수 종류(MD5, SHA, HAVAL, RIPEMD 등) 비교표

해시(Hash) 함수 종류 일부 내용들은 콘텐츠 보호를 위해 이웃공개 또는 서로이웃 공개로 설정되었음을 양...

blog.naver.com

해시함수의 종류 :

https://ko.wikipedia.org/wiki/%EC%95%94%ED%98%B8%ED%99%94_%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98

 

암호화 해시 함수 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 암호화 해시 함수(cryptographic hash function)은 해시 함수의 일종으로, 해시 값으로부터 원래의 입력값과의 관계를 찾기 어려운 성질을 가지는 경우를 의미한다. 암호화 해시 함수가 가져야 하는 성질은 다음과 같다.[1] 역상 저항성(preimage resistance): 주어진 해시 값에 대해, 그 해시 값을 생성하는 입력값을 찾는 것이 계산상 어렵다. 즉, 제 1 역상 공격에 대해 안전해야 한다. 이

ko.wikipedia.org

해시 : https://ratsgo.github.io/data%20structure&algorithm/2017/10/25/hash/

 

해싱, 해시함수, 해시테이블 · ratsgo's blog

이번 글에서는 해싱(hashing)에 대해 살펴보도록 하겠습니다. 이 글은 고려대 김선욱 교수님 강의와 위키피디아, 그리고 스택오버플로우와 고니 님의 블로그를 참고해 정리하였음을 먼저 밝힙니다. 그럼 시작하겠습니다. concepts 해시함수(hash function)란 데이터의 효율적 관리를 목적으로 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수입니다. 이 때 매핑 전 원래 데이터의 값을 키(key), 매핑 후 데이터의 값을 해시값(hash

ratsgo.github.io