Hash函数我们可以自己用C来编写,但是如果在VC中就不必了,因为在VC中有实现hash算法的 函数可以调用,就是CryptAcquireContext函数,这个函数的定义在wincrypt.h头文件中。下面是我在MFC中实现的,因为想要结果输出到messagebox中,所以就在视类里定义和实现了GetHash函数来计算哈希值。

    

#define _WIN32_WINNT 0x0400
 #include <tchar.h>
 #include <wincrypt.h>

      其中我们用到的CryptAcquireContex函数就在wincrypy.h中定义了。

     

GetHash(BYTE *pbData, DWORD dwDataLen, ALG_ID algId, LPTSTR pszHash)

     先看一下这个函数几个参数的意义吧.

// 计算Hash,成功返回0,失败返回GetLastError()
 //  CONST BYTE *pbData, // 输入数据
 //  DWORD dwDataLen,     // 输入数据字节长度
 //  ALG_ID algId       // Hash 算法:CALG_MD5,CALG_SHA
 //  LPTSTR pszHash,

   然后我们在View类中完成对GetHash函数的定义,如下:

DWORD CHash_testView::GetHash(BYTE *pbData, DWORD dwDataLen, ALG_ID algId, LPTSTR pszHash)
 { DWORD dwReturn = 0;
   HCRYPTPROV hProv;
   if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
     return (dwReturn = GetLastError());
  
   HCRYPTHASH hHash;
   //Alg Id:CALG_MD5,CALG_SHA
   if(!CryptCreateHash(hProv, algId, 0, 0, &hHash))
   {
     dwReturn = GetLastError();
     CryptReleaseContext(hProv, 0);
     return dwReturn;
   }
  
   if(!CryptHashData(hHash, pbData, dwDataLen, 0))
   {
     dwReturn = GetLastError();
     CryptDestroyHash(hHash);
     CryptReleaseContext(hProv, 0);
     return dwReturn;
   }
  
   DWORD dwSize;
   DWORD dwLen = sizeof(dwSize);
   CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)(&dwSize), &dwLen, 0);
  
   BYTE* pHash = new BYTE[dwSize];
   dwLen = dwSize;
   CryptGetHashParam(hHash, HP_HASHVAL, pHash, &dwLen, 0);
  
   lstrcpy(pszHash, _T(""));
   TCHAR szTemp[3];
   for (DWORD i = 0; i < dwLen; ++i)
   {
     //wsprintf(szTemp, _T("%X%X"), pHash[i] >> 4, pHash[i] & 0xf);
     wsprintf(szTemp, "%02X", pHash[i]);
     lstrcat(pszHash, szTemp);
   }
   delete [] pHash;
  
   CryptDestroyHash(hHash);
   CryptReleaseContext(hProv, 0);
   
 }


   

VC中实现哈希Hash算法_测试

  这里为了简单的验证一下,我们就测试一个字符串,然后它的hash值我们用一个messagebox输出,看看结果,我们测试的字符串是“Hello,Hash!你好,哈希!”其中没有空格,标点符号为英文状态。我们在OnDraw函数中加入测试代码:

TCHAR szStr[20] = {0};
   TCHAR szHash[41] = {0};
  
   strcpy(szStr,"Hello,Hash!你好,哈希!");
   GetHash((BYTE*)szStr, strlen(szStr), CALG_MD5,szHash);


 

VC中实现哈希Hash算法_null_02


VC中实现哈希Hash算法_byte_03


VC中实现哈希Hash算法_算法_04

 当然上面都是实现的MD5算法,如果想用SHA算法,可以修改调用GetHash((BYTE*)szStr, strlen(szStr), CALG_MD5,szHash);的第三个参数为CALG_SHA

 有兴趣的就可以自己编写一个hash计算工具了。