Hash

- 2 mins

1. Hash란?

2. Hash Function

 int index = hashFunction("key") % m ;

식으로 얻어 낼 수 있고 index의 범위는 0 ~ m전까지의 수로 나타내어진다. 여기서 우리는 modular 연산하는데 있어서 m의 값을 정하는게 중요한데 보통 key값의 3배가 정당하다고 한다.혹은 2의 지수승에 근접한 수가 좋다고한다. 또한 해시함수는 임의의 키값에 대해서 임의의 해시값이 고르게 분포되어 질 수 있도록 하는게 좋은 해시 함수이다.
이렇게 해시함수로 얻어낸 HashCode는 데이터에 대한 고유한 정숫값을 말한다. 객체를 비교할 때 우리는 equals()를 사용하여 객체를 비교하는데 이 때 HashCode를 보고 비교하게 된다. 그렇지만 String 클래스에서는 조금 다르다. HashCode는 객체마다 고유한 정숫값을 가지고 있다고 했지만 실제로

String a = "Java";
String b= new String("Java");

//a, b 객체는 서로다른 객체이므로 고유한 정숫값을 가져야하는게 맞지만
//실제 해쉬코드 값은 같은 값을 보여주게 된다.
a.hashCode() = 3254818
b.hashCode() = 3254818

이러한 이유는 String 클래스에 제공하는 hashCode()의 구현이 실제로 Object클래스의 hashCode()와는 다르게 재정의 하여 구현이 되어 있기 때문이 다. 또한 다른 객체라 하더라도 hashCode값은 동일할 수 있는데 이렇기에 우리는 equals를 통해 false값이 나오더라도 hashCode의 값이 꼭 다를 필요 가 없다는것을 알아야한다.

3. Collision (충돌)

3-1. Open Addressing

  h(i,k) = ( h'(k) + c1*i^2 + c2*i) mod m

3-2. Chaining

[참고] https://www.cnblogs.com/davenkin/p/java-collections.html

최근 알고리즘 문제를 풀면서 해쉬를 언제 어떻게 사용해야하는지 익히는 중인데 이 포스팅을 하면서 해쉬의 개념을 다시 알게 되면서 도움이 되고 있는것 같다. 문제를 풀면서 새롭게 알던것을 계속해서 추가하면서 수정할 것이다.


TaeSeong Min

TaeSeong Min

A Man who develops the software with coffee

comments powered by Disqus
rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora