VC HASH函數

來源:互聯網
上載者:User
    在程式很多地方都需要使用到MD5與SHA1之類的HASH函數,當然你可以自己實現,或去網上找實現的源碼,但如果你在VC環境中的話,你就沒有必要了,直接可以調用CAPI了,在程式中加上的標頭檔#include <wincrypt.h>

    下面的函數可以完成計算Hash的功能:Code
// 計算Hash,成功返回0,失敗返回GetLastError()
//  CONST BYTE *pbData    輸入資料 
//  DWORD dwDataLen        輸入資料位元組長度 
//  ALG_ID algId        Hash 演算法:CALG_MD5,CALG_SHA
//  BYTE* pHash            輸出hash值
//
DWORD ComputeHash(CONST BYTE *pbData, DWORD dwDataLen, ALG_ID algId, BYTE*& pbOutHash, DWORD& dwHashLen)
{
    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 dwLen = sizeof(dwHashLen);
    CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)(&dwHashLen), &dwLen, 0);

    pbOutHash = new BYTE[dwHashLen];
    dwLen = dwHashLen;
    CryptGetHashParam(hHash, HP_HASHVAL, pbOutHash, &dwLen, 0);

    CryptDestroyHash(hHash);
    CryptReleaseContext(hProv, 0);
    return dwReturn;
    下面是測試代碼:Code
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // 初始化 MFC 並在失敗時顯示錯誤
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: 更改錯誤碼以符合您的需要
        _tprintf(_T("錯誤: MFC 初始化失敗\n"));
        nRetCode = 1;
    }
    else
    {
        // TODO: 在此處為應用程式的行為編寫代碼。
        wstring s= _T("你好,你在哪裡ss");
        string result;
        UnicodeToOther(s, result, CodePages::utf_8);
        BYTE* hashData = (BYTE*)result.c_str();
        BYTE* hash;
        DWORD hashLen;
        ComputeHash(hashData, (int)result.length() - 1, CALG_SHA1, hash, hashLen); // 這裡一定要-1
        for(int i = 0; i < hashLen; i ++)
        {
            cout<<(unsigned int)hash[i]<<",";
        }
    }

    return nRetCode;

    經實驗與.NET中的計算結果一致。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.