#ifndef ___GHASH_H___
#define ___GHASH_H___
class CGHash
{
public:
CGHash();
virtual ~CGHash();
void Init();
void Update(const unsigned char *pData, unsigned long uSize);
void FinalToStr(char *strOutput, int nHash);
private:
unsigned long m_hash3;
unsigned long m_hash5;
};
#endif // ___GHASH_H___
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "ghash.h"
CGHash::CGHash()
{
Init();
}
CGHash::~CGHash()
{
Init();
}
void CGHash::Init()
{
m_hash3 = 0;
m_hash5 = 0;
}
void CGHash::Update(const unsigned char *pData, unsigned long uSize)
{
unsigned long i = 0;
for(i = 0; i < uSize; i++)
{
m_hash3 = (m_hash3 << 3) + m_hash3 + pData[i];
m_hash5 = (m_hash5 << 5) + m_hash5 + pData[i];
}
}
void CGHash::FinalToStr(char *strOutput, int nHash)
{
// Do NOT destroy internal hash states here!
if(nHash == 3)
{
sprintf(strOutput, "%02X%02X%02X%02X",
(m_hash3 & 0xFF000000) >> 24,
(m_hash3 & 0x00FF0000) >> 16,
(m_hash3 & 0x0000FF00) >> 8,
m_hash3 & 0x000000FF);
}
if(nHash == 5)
{
sprintf(strOutput, "%02X%02X%02X%02X",
(m_hash5 & 0xFF000000) >> 24,
(m_hash5 & 0x00FF0000) >> 16,
(m_hash5 & 0x0000FF00) >> 8,
m_hash5 & 0x000000FF);
}
}