티스토리 툴바


작성:http://ospace.tistory.com/(ospace114@empal.com) 2012.01.09

 

들어가기

개발하다보면 hash라를 말을 자주 들어본다. 그리고 hash 함수를 만들어보기도 한다. 그냥 배껴서 만들기보다는 hash가 왜 필요한지, 어떻게 만들어지는지 간단하게 알아보면 좀더 잘 사용할 수 있을 거라 생각한다. 본인도 기억이 가물가물해져서 좀더 정확히 집고넘어가고자 이번 기회에 내용을 간단하게 정리하려고 한다.

 

Hash란

Hash의 목적은 긴 데이터를 짧은 값으로 변환한 것을 말한다. 짧은 값을 인덱스로 사용하여 관리하면 긴 데이터 검색하는 것 보다 더 짧은 시간에 데이터를 검색할 수 있을 것이다.  특히 값을 주소와 연계된다면 검색 시간은 상수값이 된다. 그러면 검색 처리하는 시간이 엄청나게 줄어드는 것은 자명한 일이다. 즉 데이터 10바이트 비교하는 것 보다 4바이트 비교하는게 빠른 것은 당연하다.

 

그러나 실제 Hash가 인덱스처럼만 사용하는게 아니라 에러 검출이나 암호화에서도 사용된다.

 

Hash 함수

그럼 Hash을 어떻게 만들까? Hash을 만드는 것은 Hash  함수에 의해서 생성된다. 즉, Hash 함수가 hash을 생성한다.

 

Hash함수에서 중요한 것은 다음 3가지이다.

  • 공간 밀도
  • 분포도
  • 시간

 

앞에서 간 데이터를 짧은 데이터로 변경되었으니 데이터 범위가 줄어드는 것은 당연하다.

 

예를 들어 알파벳 4개를 조합해서 생성할수 있는 경우의 수는 45만개 이상이 된다. 이를 고려하기 위해 알파벳 4번을 비교하는 것을 hash로 만들경우 한번의 비교로 원하는 경우로 변경할 수 있다. 그러면 많은 시간이 절약될 것 이다. 이때 hash의 크기가 중요하다. short형(2byte)인 숫자로 변경된다면 unsigned형으로 최대 약 6만개 정도  지정 가능하다. 비율로 나타내면 약 0.13 정도 된다. 이를 공간 밀도 혹은 패킹 밀도라고 한다. 이 경우는 밀도가 너무 높은 경우이므로 10개 이상을 담기 시작하면 1개 정도 충돌이 발생한다는 의미이다. 자신의 데이터 분포를 잘 고려해서 적당한 밀도를 선택하는게 중요하다.

 

Hash함수는 넓은 분포도를 가져야 한다. Hash가 생성되어도 한쪽으로 값이 치우치게 된다면 금방 충돌이 발생하여 효율성이 떨어지게 될 것이다. 이 것 역시 데이터 특성을 고려해야 한다.

 

또한 Hash을 생성함에 있어서 중요한 것이 생성 시간이다. 한번 생성할 때마다 오래 걸린다면, 처리 성능 향상을 위한 목적이 유명무실하게 된다.

 

Hash 함수 생성 방법

생성 방법은 아래와 같은 것이 있다.

  • Division
  • Mid-Squre
  • Digit Analysis
  • Folding
  • Radix Exchange
  • Pseudo Random

 

Division

나머지 연산자(%)을 사용하여 나머지 값을 사용하는 방식.

아주 간단하지만 잘못된 값 선택시 충돌 발생 가능성이 매우 높음.

일반적으로 소수를 사용함.

 

Mid Square

값을 제곱하여(square) 중간에 임의 값을(mid) 주소로 사용.

값이 조금만 틀려도 다른 값을 가질 확률이 높다.

 

Digit Analysis

데이터를 분석하여 고른 분포를 가지는 데이터 영역들을 선택하여 사용.

 

Folding

긴 데이터를 일정 크기로 나눠서 값을 더하거나 XOR한 값을 주소로 사용.

앞에서 차례로 더하는 경우 Shift Folding이라고 하고, 처음 값을 그대로 다음 값은 역 순으로, 다시 다음은 값 그대로 사용하여 더하는 방식을 Boundary Folding이라고 한다.

  • ABCDEFGHIJKL인 경우

    • Shilf Folding: ABC + DEF + GHI + JKL
    • Boundary Folding: ABC + FED + GHI + LKJ

 

Radix Exchange

진법을 변환하거나 임의 진법이라 간주하여 변환된 값을 키로 사용.

 

Pseudo Random

임의 랜덤값을 사용

 

기타사항

Windows의 MFC 메시지 맵에서 사용한 Hash 함수

unsigned int hash = (pMessageMap ^ messageId) & (512-1)

 

이 방식은 Folding형태라고 볼 수 있다. 메시지 맵와 메시지 아이디를 이용하여 해쉬를 구함. 해시 범위는 총 512개이다. 즉 같은 메시지 아이디라고 해도 메시지 맵에 따라 달라지기 때문에 메시지 맵 변경으로 해쉬가 변경된다. 뒤에 (512-1)은 Division형태라고 볼 수 있지만, 여기서는 맵 크기에 따라서 달라지는 값이기에 소수를 사용하는 것은 아니다.

 

참고

[1] http://internet512.chonbuk.ac.kr/datastructure/hash/hash1.htm

[2] http://blog.bagesoft.com/876

[3] http://www.codesos.com/book/algori/hash/hash.html

 

 

 

이 글은 스프링노트에서 작성되었습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by ospace

댓글을 달아 주세요


정말좋은 수학기호 모음이다. "빛의 탑"님 블러그에서 가져왔습니다.



출처: http://lsujang.egloos.com/page/14

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by ospace

댓글을 달아 주세요

로그(Log)

작성:http://ospace.tistory.com/(ospace114@empal.com) 2008.11.11


로그는 수함함수이다. 어떤 값에 몇 승하는 식을 다르게 표현한 형태이다.

그럼 예를 들어,

x^n = y


x에 n승을 하면 결과 y 값을 얻는 식이다. 이를 로그식 표현으로 하면,

log_x y = n


즉, log 밑으로 하는 y 값이 n이다.
밑이 e이면 자연로그라고 한다.

e^n = y  ==> ln y = n


10^n = y  ==> log y = n


로그를 다른 관점에서 다시 해석하면,

log y = n ( 이는 log_10 )

일반적으로 log 밑이 10인 경우를 보면, 10에 몇 승(n)을 해야 y값이 되는가를 말한다. 즉, 10으로  y값을 만들기위한 승수를 알 수 있다.

이 개념을 좀더 확장하면, 아주 큰 숫자를 작은 승수 값으로 변경할 수 있다는 의미이다. 소수점 이하의 아주 약간의 오차가 생기지만, 매우큰 범위의 숫자를 다룰 수 있는 장점이 생긴다.


예를 들어, 1 ~ 1,000,000,000 범위의 숫자가 있다고 하자. 즉 1T(테라) 값의 범위이다.

이를 log_10으로 변환하면,


1 ~ 1,000,000,000 ===( log_10 )===> 0 ~ 9

이제 0~9 범위의 값을 다루면 된다. 물론 다시 원래 값으로 돌리려면 10^n 승을 해주면 된다.


좀더, 자세한 정보를 위키사전 로그를 참조.


History

20091120, ospace, 값의 범위를 축약하는 의미

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by ospace
TAG log, 로그

댓글을 달아 주세요

지수함수와 삼각함수의 관계

작성자: 박재성(Ospace114@naver.컴), 2007.10.31


복소좌표상에 임의의 위치가 있을 때 이를 절대값과 편각으로 표현이 가능하다.

사용자 삽입 이미지


이를 복소 좌표에서 삼각함수로 표현하면 다음과 같이 된다.

r(cos x + i sin x)

이를 다시 지수함수로 표현하면 다음과 같이 된다.

r e^(ix)

이 둘은 서로 같은 표현이다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by ospace

댓글을 달아 주세요

쌍곡함수가 무엇인가

작성자: 박재성(Ospace114@empal.com), 2007.10.31

쌍곡 삼각함수는 비유클리드 기하인 쌍곡 기하를 공부하기 위해서 만들었다. 또 다른 비유클리드 기하인 구면기하를 하다보면 자연스럽게 삼각함수 역활을 쌍곡삼각함수가 해낼때가 많다.
그렇기에 쌍곡함수가 삼각함수와 모습은 다르지만 매우 비슷한 성질을 가졌기에 가능하다.

예를 들어 int 1 / root(1 - x^2) dx를 계산할때 x = sin t라 치환한다. 이렇게 치환하는 이유는 root(1 - sin^2(t)) = cos(t)가 되기 때문이다.
마찬가지로 int 1/root(1 + x^2) dx를 계산할때 x = sinh t로 치환한다. 이렇게 하는 이유는 root(1 + sinh^2 t) = cosh t가 된다. 물론, cosh^2 t - sinh^2 t = 1를 알면 쉽다.

이 형태가 쌍곡선 x^2 - y^2 = 1 위에 있고 이를 쌍곡선 함수라고 한다.

x^2 - y^2 = 1인 매개화는 여러가지가 가능하다. 예로 (sec t, tan t) 또는 (( e^t + e^-t)/2), (( e^t - e^-t)/2)도 있다. 이중에 두번째가 성질이 의외로 삼각함수와 비슷해서 표기형태를 cosh t, sinh t를 사용한다.

몇 개만 예를 들면,

cosh^2 t - sinh^2 t = 1이고 sinh(2t) = 2sinh(t) cosh(t)가 된다.
원의 방정식이 x^2 + y^2 = 1 임을 감안하고 y -> iy로 치환하면 거칠게 말하면(논리적인 표현이 아님) 복소수의 삼각함수와 쌍곡함수가 서로 밀접한 관련이 있다라고 할 수 있다.

테일러 정의를 배우게 되면 지수함수와 삼각 함수는 근본적으로 다른 함수가 아니라는 놀라운 사실을 알게 된다.


출처: www.mathlove.org


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by ospace

댓글을 달아 주세요

적분 방법에 따라서 적분 값이 왜 다른가


작성자: 박재성(Ospace114@naver.컴), 2007.10.31


결론을 말하면 적분하는 방법에 따라서 적분에서 나타나는 적분 상수 값이 달라진다. 그러나 표현만 다를뿐 같은 값이다.

그럼 간단한 예를 보자.

int sin(2x) dx

라는 적분을 보자. 먼저 치환적분으로 살펴 보고 다음으로 2배각 공식을 살펴보자.


치환적분으로 구하면

-1/2 cos(2x) + C

가 된다.

다음으로 2배각 공식으로 구하면

sin^2(x) + C`

가 된다. 이는 같은 값이다.
이는 cos(2x) = 1 - 2sin^2(x)을 안다면, 위의 두 결과는 같은 값임을 알 것이다. 즉,

C - 1/2 = C`

이된다.



출처: www.mathlove.org
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by ospace

댓글을 달아 주세요

자연로그 e와 삼각함수 개념
작성자: 박재성(Ospace114@naver.컴), 2007.10.31


자연로드와 지수함수 그리고 삼각함수는 고등학교 수학에서 지겹게 보았었고, 대학을 공대를 나온 분들도 다시 지겹게 보았을 것이다.

당시에는 이런걸 어디에 써먹을까? 이건 수학이 재미있으서 순수학문 형태로 혹은 과학 특정분야에서 일부 사용할거라고 생각을 했었다. 그러나 막상 소프트웨어 개발을 하다보니 본이아니게 수학을 접하게 되었고, 최근에는 푸리에 급수까지 공부하게 되었다. 그래도 여전히 어려운게 수학이다.

실제로는 컴퓨터 소프트웨어 개발 외에도 통계에서도 은행에서 각종 이자 계산 등에서도 빈번히 사용되고 있고 삼각함수는 토지측량에도 사용된다.


사용자 삽입 이미지
 
그림1) 지수함수와 자연로그
 


자연로그 e는?

자연로그 e는 a^x(이는 a에 x승)의 미분이 a^x가 되는 a값이다. 그렇기에 미분과 적분에서 많이 사용된다.

인구 증가율은 현재 인구량에 비례한다. 현재 인구가 많다면 인구 증가량은 증가된다는 의미이다. 현재 시간 t라하면 현재 인구 수는 f(t)로 한다고 하자.

현재 인구수 = f(t), t는 현재 시간

현재 인구수를 미분(f`(t))하면,

f`(t) = a f(t), a는 상수

미분이 근본적으로 미분한 결과가 자신과 같을 경우에 함수가 지수함수라고 한다. 그렇기에

f(t) = e^x

이면, 이를 미분한 결과는

f`(t) = e^x

가 된다. 그래서 자연로그를 밑으로 하는 지수함수 형태를 미분 적분에서 많이 사용된다.


자연로그 e는 어떤 값?


다음의 오일러 수를 구하는 식에 의해서 구해지는 값을 e로 한다.

사용자 삽입 이미지
값은 2.7182818284688으로 가는 무리수가 된며 초월수(다항식 근이 될 수 없는 식)가 된다.

초월수(Transcendental Number)는 다음과 같다.

c = 1/0! + 1/1! + 1/2! + 1/3! + 1/4! + ...






출처: www.mathlove.org
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by ospace

댓글을 달아 주세요