글 수 429
// Test.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. // #include <stdio.h> #include <tchar.h> #include <math.h> typedef unsigned int UINT; struct BoolArray{ bool Data[32]; }; BoolArray NewBoolArray(); UINT Algorithm(char * szSource); BoolArray Plus(BoolArray arSource,char cAdd); BoolArray Shift(BoolArray arSource,int nSize); BoolArray Or(BoolArray ar1,BoolArray ar2); UINT RetArray(BoolArray arTmp); const int rotateBy=7; int main(int argc, char* argv[]) { char * szText = "Test Text"; UINT uAnswer = Algorithm(szText); printf("%un",uAnswer); return 0; } UINT Algorithm(char * szText) { UINT uRet=0; BoolArray arTemp = NewBoolArray(); int nSize = strlen(szText); //길이를 구했음 for(int i=0;i<nSize;i++) { arTemp = Plus(Or(Shift(arTemp,rotateBy),Shift(arTemp,rotateBy-32)),szText[i]); //문제의 그 연산 -_-; } return RetArray(arTemp); } //초기화 함수입니다. VB에선 자동으로 해줄듯 -_-; BoolArray NewBoolArray() { BoolArray arTemp; for(int i=31;i>=0;i--) { arTemp.Data[i]=0; } return arTemp; } BoolArray Plus(BoolArray arSource,char cAdd) { //숫자를 더합니다... int nTemp = cAdd; //귀찮아서 미리 변환 -_- //일단 변환 BoolArray arChar = NewBoolArray(); //pow(a,b)는 a^b와 동일합니다. int nPow=(float)pow((float)2,8); int nPow2=nPow/2; for(int i=7;i>=0;i--) { if((nTemp%nPow)/nPow2>0) { arChar.Data[i]=1; } nPow = nPow2; nPow2 = nPow/2; } //더하기 -_-; BoolArray arRet = NewBoolArray(); int nFlag=0; for(int i=0;i<32;i++) { int nTemp= nFlag+arChar.Data[i]+arSource.Data[i]; if(nTemp>1) nFlag=1; else nFlag=0; if(nTemp%2==1) arRet.Data[i]=1; else arRet.Data[i]=0; } return arRet; } //Shift연산입니다. +면 <<, -면 >>입니다. BoolArray Shift(BoolArray arSource,int nSize) { BoolArray arRet=NewBoolArray(); for(int i=0;i<32;i++) { int nTemp=i+nSize; if(0<=nTemp&&nTemp<32) { arRet.Data[nTemp]=arSource.Data[i]; } } return arRet; } //Or연산입니다. BoolArray Or(BoolArray ar1,BoolArray ar2) { BoolArray arRet = NewBoolArray(); for(int i=0;i<32;i++) { if(ar1.Data[i] != 0 || ar2.Data[i] != 0) { arRet.Data[i]=1; } } return arRet; } UINT RetArray(BoolArray arTmp) { UINT uRet=0; for(int i=31;i>=0;i--) { uRet = uRet * 2; if(arTmp.Data[i]==1) { uRet = uRet + 1; } } return uRet; }
원본 코드가 단지
typedef unsigned int HASH; //--------------------------------------------------------- // sample hash creation functions //--------------------------------------------------------- inline HASH HashRotateLeft( HASH hash, const unsigned int rotateBy ) { return (hash<<rotateBy)|(hash>>(32-rotateBy)); } //--------------------------------------------------------- // create a hash from a string //--------------------------------------------------------- template<typename T> inline HASH MakeStringHash( const T *pString ) { HASH ret = 0; T c; if( pString ) { while( c=*(pString++) ) ret = HashRotateLeft(ret,7) + c; } return ret; }
이것뿐이란걸 생각해보면 그냥 후덜덜 하군요.
아. 혹시나 해서 이 게시물의 의미에 대해서 설멍
VB로 위의 MakeStringHash함수를 옮겨야 하는데,
VB에서는 비트 연산자가 없기 때문에 -_-;;
일일히 기본 연산을 가지고 처리하도록 새로만든 함수입니다.
완성된 내용은 VB로 저 내용을 간단히 옮길 수 있으....리라고 봅니다만,
어떨지는 모르겠습니다.
이렇게 풀어서 다시 짜주시다니...ㅠ.ㅠ
머리 아프셨을텐데 정말 정말 감사드립니다...(_ _)