프로그래밍을 하다보면 string 을 많이 사용합니다. 이런 string 을 특별한 정수 코드로 만들어 사용할 필요성이 있습니다. 그러나 길이가 가변적인 string 들을 코드화 했을경우 전혀 다른 숫자가 나와야 합니다.
이런경우 hash 를 사용하게 되는데, 이러한 방식의 연장선상에 있는 것이 각종 암호화 하는 기법이 되겠죠.
즉 string 에의하여 만들어진 정수 코드값에서 거꾸로 string 을 추출 할 수 없습니다. 단 해당 코드에 대한 string
값을 테이블에 넣어두면 찾을 수 있겠죠.
이러한 hashing 기법을 사용하면 , 역시 string 으로 구성된 파일을 압축할 수도 있습니다. 앞축 파일 앞에 코드 테이블을 넣어 놓고요. 그러나 단어의 빈도수를 생각하지 않는 방식이라 압축율은 그다지 보장을 못하지만요..
일반적으로 String Hash 에 사용하는 알고리즘은 다음과 같습니다.
h = s[0]*31^(n-1) + s[1]*31^(n-2) ..............+s[n-1];
위의 수식에서
h = 정수값으로 hash 값
n = string length
32 = 최대 보장 string 길이 , 즉 최대 32자 까지 서로 다른 hash 를 보장 한다는 것이죠.
s[?] = 문자열의 문자.
즉 32를 자신이 원하는 숫자로 바꾸면 그 자리숫자까지 처리 가능합니다. 물론 자꾸 커지면 정수의 범위를 넘어설
수도 있다는것에 주의해야 합니다.
위의 식을 C 로 작성한다면 다음과 같죠.
int h = 0;
for (int i = 0; i < n; i++)
{
h = 31*h + s[i];
}
대부분 다 알고 계시는 기본적인 것이지만 혹시 모르시는 분이 있을까봐 적어 봅니다.
|
제 상식으로는 이해가 되지 않는데요.
상기 코드를 보면
hash value range는 4바이트이고
string 길이는 32바이트라면
결국 birthday paradox에 의해 중첩된 hash value가 생겨날 수 밖에 없는 것인데...
그리고 hash가 압축에 사용되어 진다는 얘기는 뭔가요?
hash자체가 encoding만 가능하지, decoding은 안된다는 것을 전제로 하는데...
이해가 잘 안되네요, 제가 잘 몰라서요...