글 수 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로 저 내용을 간단히 옮길 수 있으....리라고 봅니다만,
어떨지는 모르겠습니다.
이렇게 풀어서 다시 짜주시다니...ㅠ.ㅠ
머리 아프셨을텐데 정말 정말 감사드립니다...(_ _)