C++计算文件MD5值
来源:互联网 发布:网络白客 编辑:程序博客网 时间:2024/05/16 08:43
MD5ChecksumDefines.h
//Magic initialization constants#define MD5_INIT_STATE_0 0x67452301#define MD5_INIT_STATE_1 0xefcdab89#define MD5_INIT_STATE_2 0x98badcfe#define MD5_INIT_STATE_3 0x10325476//Constants for Transform routine.#define MD5_S11 7#define MD5_S12 12#define MD5_S13 17#define MD5_S14 22#define MD5_S21 5#define MD5_S22 9#define MD5_S23 14#define MD5_S24 20#define MD5_S31 4#define MD5_S32 11#define MD5_S33 16#define MD5_S34 23#define MD5_S41 6#define MD5_S42 10#define MD5_S43 15#define MD5_S44 21//Transformation Constants - Round 1#define MD5_T01 0xd76aa478 //Transformation Constant 1 #define MD5_T02 0xe8c7b756 //Transformation Constant 2#define MD5_T03 0x242070db //Transformation Constant 3#define MD5_T04 0xc1bdceee //Transformation Constant 4#define MD5_T05 0xf57c0faf //Transformation Constant 5#define MD5_T06 0x4787c62a //Transformation Constant 6#define MD5_T07 0xa8304613 //Transformation Constant 7#define MD5_T08 0xfd469501 //Transformation Constant 8#define MD5_T09 0x698098d8 //Transformation Constant 9#define MD5_T10 0x8b44f7af //Transformation Constant 10#define MD5_T11 0xffff5bb1 //Transformation Constant 11#define MD5_T12 0x895cd7be //Transformation Constant 12#define MD5_T13 0x6b901122 //Transformation Constant 13#define MD5_T14 0xfd987193 //Transformation Constant 14#define MD5_T15 0xa679438e //Transformation Constant 15#define MD5_T16 0x49b40821 //Transformation Constant 16//Transformation Constants - Round 2#define MD5_T17 0xf61e2562 //Transformation Constant 17#define MD5_T18 0xc040b340 //Transformation Constant 18#define MD5_T19 0x265e5a51 //Transformation Constant 19#define MD5_T20 0xe9b6c7aa //Transformation Constant 20#define MD5_T21 0xd62f105d //Transformation Constant 21#define MD5_T22 0x02441453 //Transformation Constant 22#define MD5_T23 0xd8a1e681 //Transformation Constant 23#define MD5_T24 0xe7d3fbc8 //Transformation Constant 24#define MD5_T25 0x21e1cde6 //Transformation Constant 25#define MD5_T26 0xc33707d6 //Transformation Constant 26#define MD5_T27 0xf4d50d87 //Transformation Constant 27#define MD5_T28 0x455a14ed //Transformation Constant 28#define MD5_T29 0xa9e3e905 //Transformation Constant 29#define MD5_T30 0xfcefa3f8 //Transformation Constant 30#define MD5_T31 0x676f02d9 //Transformation Constant 31#define MD5_T32 0x8d2a4c8a //Transformation Constant 32//Transformation Constants - Round 3#define MD5_T33 0xfffa3942 //Transformation Constant 33#define MD5_T34 0x8771f681 //Transformation Constant 34#define MD5_T35 0x6d9d6122 //Transformation Constant 35#define MD5_T36 0xfde5380c //Transformation Constant 36#define MD5_T37 0xa4beea44 //Transformation Constant 37#define MD5_T38 0x4bdecfa9 //Transformation Constant 38#define MD5_T39 0xf6bb4b60 //Transformation Constant 39#define MD5_T40 0xbebfbc70 //Transformation Constant 40#define MD5_T41 0x289b7ec6 //Transformation Constant 41#define MD5_T42 0xeaa127fa //Transformation Constant 42#define MD5_T43 0xd4ef3085 //Transformation Constant 43#define MD5_T44 0x04881d05 //Transformation Constant 44#define MD5_T45 0xd9d4d039 //Transformation Constant 45#define MD5_T46 0xe6db99e5 //Transformation Constant 46#define MD5_T47 0x1fa27cf8 //Transformation Constant 47#define MD5_T48 0xc4ac5665 //Transformation Constant 48//Transformation Constants - Round 4#define MD5_T49 0xf4292244 //Transformation Constant 49#define MD5_T50 0x432aff97 //Transformation Constant 50#define MD5_T51 0xab9423a7 //Transformation Constant 51#define MD5_T52 0xfc93a039 //Transformation Constant 52#define MD5_T53 0x655b59c3 //Transformation Constant 53#define MD5_T54 0x8f0ccc92 //Transformation Constant 54#define MD5_T55 0xffeff47d //Transformation Constant 55#define MD5_T56 0x85845dd1 //Transformation Constant 56#define MD5_T57 0x6fa87e4f //Transformation Constant 57#define MD5_T58 0xfe2ce6e0 //Transformation Constant 58#define MD5_T59 0xa3014314 //Transformation Constant 59#define MD5_T60 0x4e0811a1 //Transformation Constant 60#define MD5_T61 0xf7537e82 //Transformation Constant 61#define MD5_T62 0xbd3af235 //Transformation Constant 62#define MD5_T63 0x2ad7d2bb //Transformation Constant 63#define MD5_T64 0xeb86d391 //Transformation Constant 64//Null data (except for first BYTE) used to finalise the checksum calculationstatic unsigned char PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};CMD5Checksum.h
#if !defined(AFX_MD5CHECKSUM_H__2BC7928E_4C15_11D3_B2EE_A4A60E20D2C3__INCLUDED_)#define AFX_MD5CHECKSUM_H__2BC7928E_4C15_11D3_B2EE_A4A60E20D2C3__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000/***************************************************************************************** *****************************************************************************************/class CMD5Checksum {public: static CString GetMD5OfString(CString strString); //interface functions for the RSA MD5 calculation static CString GetMD5(const CString& strFilePath);protected: //constructor/destructor CMD5Checksum(); virtual ~CMD5Checksum() {}; //RSA MD5 implementation void Transform(BYTE Block[64]); void Update(BYTE* Input, ULONG nInputLen); CString Final(); inline DWORD RotateLeft(DWORD x, int n); inline void FF( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T); inline void GG( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T); inline void HH( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T); inline void II( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T); //utility functions inline void DWordToByte(BYTE* Output, DWORD* Input, UINT nLength); inline void ByteToDWord(DWORD* Output, BYTE* Input, UINT nLength);private: BYTE m_lpszBuffer[64]; //input buffer ULONG m_nCount[2]; //number of bits, modulo 2^64 (lsb first) ULONG m_lMD5[4]; //MD5 checksum};#endif // !defined(AFX_MD5CHECKSUM_H__2BC7928E_4C15_11D3_B2EE_A4A60E20D2C3__INCLUDED_)
MD5Checksum.cpp
#include "stdafx.h"#include "MD5Checksum.h"#include "MD5ChecksumDefines.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif/**********************************************************************************************************************************************************************************/CString CMD5Checksum::GetMD5(const CString& strFilePath){try{ CFile file;if(file.Open(strFilePath,CFile::modeRead)==0)return _T("");CMD5Checksum MD5Checksum; //checksum object int nLength = 0; //number of bytes read from the fileconst int nBufferSize = 1024; //checksum the file in blocks of 1024 bytesBYTE Buffer[nBufferSize]; //buffer for data read from the file//checksum the file in blocks of 1024 byteswhile ((nLength = file.Read( Buffer, nBufferSize )) > 0 ){ MD5Checksum.Update( Buffer, nLength );}file.Close();//finalise the checksum and return itreturn MD5Checksum.Final();}//report any file exceptions in debug mode onlycatch (CFileException* e ){ TRACE0("CMD5Checksum::GetMD5: CFileException caught"); throw e;}}/*****************************************************************************************FUNCTION: CMD5Checksum::RotateLeftDETAILS: privateDESCRIPTION: Rotates the bits in a 32 bit DWORD left by a specified amountRETURNS: The rotated DWORD ARGUMENTS: DWORD x : the value to be rotatedint n : the number of bits to rotate by*****************************************************************************************/DWORD CMD5Checksum::RotateLeft(DWORD x, int n){ //check that DWORD is 4 bytes long - true in Visual C++ 6 and 32 bit WindowsASSERT( sizeof(x) == 4 );//rotate and return xreturn (x << n) | (x >> (32-n));}/*****************************************************************************************FUNCTION: CMD5Checksum::FFDETAILS: protectedDESCRIPTION: Implementation of basic MD5 transformation algorithmRETURNS: noneARGUMENTS: DWORD &A, B, C, D : Current (partial) checksumDWORD X : Input dataDWORD S : MD5_SXX Transformation constantDWORD T : MD5_TXX Transformation constantNOTES: None*****************************************************************************************/void CMD5Checksum::FF( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T){ DWORD F = (B & C) | (~B & D);A += F + X + T;A = RotateLeft(A, S);A += B;}/*****************************************************************************************FUNCTION: CMD5Checksum::GGDETAILS: protectedDESCRIPTION: Implementation of basic MD5 transformation algorithmRETURNS: noneARGUMENTS: DWORD &A, B, C, D : Current (partial) checksumDWORD X : Input dataDWORD S : MD5_SXX Transformation constantDWORD T : MD5_TXX Transformation constantNOTES: None*****************************************************************************************/void CMD5Checksum::GG( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T){ DWORD G = (B & D) | (C & ~D);A += G + X + T;A = RotateLeft(A, S);A += B;}/*****************************************************************************************FUNCTION: CMD5Checksum::HHDETAILS: protectedDESCRIPTION: Implementation of basic MD5 transformation algorithmRETURNS: noneARGUMENTS: DWORD &A, B, C, D : Current (partial) checksumDWORD X : Input dataDWORD S : MD5_SXX Transformation constantDWORD T : MD5_TXX Transformation constantNOTES: None*****************************************************************************************/void CMD5Checksum::HH( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T){ DWORD H = (B ^ C ^ D);A += H + X + T;A = RotateLeft(A, S);A += B;}/*****************************************************************************************FUNCTION: CMD5Checksum::IIDETAILS: protectedDESCRIPTION: Implementation of basic MD5 transformation algorithmRETURNS: noneARGUMENTS: DWORD &A, B, C, D : Current (partial) checksumDWORD X : Input dataDWORD S : MD5_SXX Transformation constantDWORD T : MD5_TXX Transformation constantNOTES: None*****************************************************************************************/void CMD5Checksum::II( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T){ DWORD I = (C ^ (B | ~D));A += I + X + T;A = RotateLeft(A, S);A += B;}/*****************************************************************************************FUNCTION: CMD5Checksum::ByteToDWordDETAILS: privateDESCRIPTION: Transfers the data in an 8 bit array to a 32 bit arrayRETURNS: voidARGUMENTS: DWORD* Output : the 32 bit (unsigned long) destination array BYTE* Input : the 8 bit (unsigned char) source arrayUINT nLength : the number of 8 bit data items in the source arrayNOTES: Four BYTES from the input array are transferred to each DWORD entryof the output array. The first BYTE is transferred to the bits (0-7) of the output DWORD, the second BYTE to bits 8-15 etc. The algorithm assumes that the input array is a multiple of 4 bytes longso that there is a perfect fit into the array of 32 bit words.*****************************************************************************************/void CMD5Checksum::ByteToDWord(DWORD* Output, BYTE* Input, UINT nLength){ //entry invariantsASSERT( nLength % 4 == 0 );ASSERT( AfxIsValidAddress(Output, nLength/4, TRUE) );ASSERT( AfxIsValidAddress(Input, nLength, FALSE) );//initialisationsUINT i=0; //index to Output arrayUINT j=0; //index to Input array//transfer the data by shifting and copyingfor ( ; j < nLength; i++, j += 4){ Output[i] = (ULONG)Input[j] | (ULONG)Input[j+1] << 8 | (ULONG)Input[j+2] << 16 | (ULONG)Input[j+3] << 24;}}/*****************************************************************************************FUNCTION: CMD5Checksum::TransformDETAILS: protectedDESCRIPTION: MD5 basic transformation algorithm; transforms 'm_lMD5'RETURNS: voidARGUMENTS: BYTE Block[64]NOTES: An MD5 checksum is calculated by four rounds of 'Transformation'.The MD5 checksum currently held in m_lMD5 is merged by the transformation process with data passed in 'Block'. *****************************************************************************************/void CMD5Checksum::Transform(BYTE Block[64]){ //initialise local data with current checksumULONG a = m_lMD5[0];ULONG b = m_lMD5[1];ULONG c = m_lMD5[2];ULONG d = m_lMD5[3];//copy BYTES from input 'Block' to an array of ULONGS 'X'ULONG X[16];ByteToDWord( X, Block, 64 );//Perform Round 1 of the transformationFF (a, b, c, d, X[ 0], MD5_S11, MD5_T01); FF (d, a, b, c, X[ 1], MD5_S12, MD5_T02); FF (c, d, a, b, X[ 2], MD5_S13, MD5_T03); FF (b, c, d, a, X[ 3], MD5_S14, MD5_T04); FF (a, b, c, d, X[ 4], MD5_S11, MD5_T05); FF (d, a, b, c, X[ 5], MD5_S12, MD5_T06); FF (c, d, a, b, X[ 6], MD5_S13, MD5_T07); FF (b, c, d, a, X[ 7], MD5_S14, MD5_T08); FF (a, b, c, d, X[ 8], MD5_S11, MD5_T09); FF (d, a, b, c, X[ 9], MD5_S12, MD5_T10); FF (c, d, a, b, X[10], MD5_S13, MD5_T11); FF (b, c, d, a, X[11], MD5_S14, MD5_T12); FF (a, b, c, d, X[12], MD5_S11, MD5_T13); FF (d, a, b, c, X[13], MD5_S12, MD5_T14); FF (c, d, a, b, X[14], MD5_S13, MD5_T15); FF (b, c, d, a, X[15], MD5_S14, MD5_T16);//Perform Round 2 of the transformationGG (a, b, c, d, X[ 1], MD5_S21, MD5_T17); GG (d, a, b, c, X[ 6], MD5_S22, MD5_T18); GG (c, d, a, b, X[11], MD5_S23, MD5_T19); GG (b, c, d, a, X[ 0], MD5_S24, MD5_T20); GG (a, b, c, d, X[ 5], MD5_S21, MD5_T21); GG (d, a, b, c, X[10], MD5_S22, MD5_T22); GG (c, d, a, b, X[15], MD5_S23, MD5_T23); GG (b, c, d, a, X[ 4], MD5_S24, MD5_T24); GG (a, b, c, d, X[ 9], MD5_S21, MD5_T25); GG (d, a, b, c, X[14], MD5_S22, MD5_T26); GG (c, d, a, b, X[ 3], MD5_S23, MD5_T27); GG (b, c, d, a, X[ 8], MD5_S24, MD5_T28); GG (a, b, c, d, X[13], MD5_S21, MD5_T29); GG (d, a, b, c, X[ 2], MD5_S22, MD5_T30); GG (c, d, a, b, X[ 7], MD5_S23, MD5_T31); GG (b, c, d, a, X[12], MD5_S24, MD5_T32);//Perform Round 3 of the transformationHH (a, b, c, d, X[ 5], MD5_S31, MD5_T33); HH (d, a, b, c, X[ 8], MD5_S32, MD5_T34); HH (c, d, a, b, X[11], MD5_S33, MD5_T35); HH (b, c, d, a, X[14], MD5_S34, MD5_T36); HH (a, b, c, d, X[ 1], MD5_S31, MD5_T37); HH (d, a, b, c, X[ 4], MD5_S32, MD5_T38); HH (c, d, a, b, X[ 7], MD5_S33, MD5_T39); HH (b, c, d, a, X[10], MD5_S34, MD5_T40); HH (a, b, c, d, X[13], MD5_S31, MD5_T41); HH (d, a, b, c, X[ 0], MD5_S32, MD5_T42); HH (c, d, a, b, X[ 3], MD5_S33, MD5_T43); HH (b, c, d, a, X[ 6], MD5_S34, MD5_T44); HH (a, b, c, d, X[ 9], MD5_S31, MD5_T45); HH (d, a, b, c, X[12], MD5_S32, MD5_T46); HH (c, d, a, b, X[15], MD5_S33, MD5_T47); HH (b, c, d, a, X[ 2], MD5_S34, MD5_T48);//Perform Round 4 of the transformationII (a, b, c, d, X[ 0], MD5_S41, MD5_T49); II (d, a, b, c, X[ 7], MD5_S42, MD5_T50); II (c, d, a, b, X[14], MD5_S43, MD5_T51); II (b, c, d, a, X[ 5], MD5_S44, MD5_T52); II (a, b, c, d, X[12], MD5_S41, MD5_T53); II (d, a, b, c, X[ 3], MD5_S42, MD5_T54); II (c, d, a, b, X[10], MD5_S43, MD5_T55); II (b, c, d, a, X[ 1], MD5_S44, MD5_T56); II (a, b, c, d, X[ 8], MD5_S41, MD5_T57); II (d, a, b, c, X[15], MD5_S42, MD5_T58); II (c, d, a, b, X[ 6], MD5_S43, MD5_T59); II (b, c, d, a, X[13], MD5_S44, MD5_T60); II (a, b, c, d, X[ 4], MD5_S41, MD5_T61); II (d, a, b, c, X[11], MD5_S42, MD5_T62); II (c, d, a, b, X[ 2], MD5_S43, MD5_T63); II (b, c, d, a, X[ 9], MD5_S44, MD5_T64);//add the transformed values to the current checksumm_lMD5[0] += a;m_lMD5[1] += b;m_lMD5[2] += c;m_lMD5[3] += d;}/*****************************************************************************************CONSTRUCTOR: CMD5ChecksumDESCRIPTION: Initialises member dataARGUMENTS: NoneNOTES: None*****************************************************************************************/CMD5Checksum::CMD5Checksum(){ // zero membersmemset( m_lpszBuffer, 0, 64 );m_nCount[0] = m_nCount[1] = 0;// Load magic state initialization constantsm_lMD5[0] = MD5_INIT_STATE_0;m_lMD5[1] = MD5_INIT_STATE_1;m_lMD5[2] = MD5_INIT_STATE_2;m_lMD5[3] = MD5_INIT_STATE_3;}/*****************************************************************************************FUNCTION: CMD5Checksum::DWordToByteDETAILS: privateDESCRIPTION: Transfers the data in an 32 bit array to a 8 bit arrayRETURNS: voidARGUMENTS: BYTE* Output : the 8 bit destination array DWORD* Input : the 32 bit source arrayUINT nLength : the number of 8 bit data items in the source arrayNOTES: One DWORD from the input array is transferred into four BYTES in the output array. The first (0-7) bits of the first DWORD are transferred to the first output BYTE, bits bits 8-15 are transferred fromthe second BYTE etc. The algorithm assumes that the output array is a multiple of 4 bytes longso that there is a perfect fit of 8 bit BYTES into the 32 bit DWORDs.*****************************************************************************************/void CMD5Checksum::DWordToByte(BYTE* Output, DWORD* Input, UINT nLength ){ //entry invariantsASSERT( nLength % 4 == 0 );ASSERT( AfxIsValidAddress(Output, nLength, TRUE) );ASSERT( AfxIsValidAddress(Input, nLength/4, FALSE) );//transfer the data by shifting and copyingUINT i = 0;UINT j = 0;for ( ; j < nLength; i++, j += 4) { Output[j] = (UCHAR)(Input[i] & 0xff );Output[j+1] = (UCHAR)((Input[i] >> 8) & 0xff);Output[j+2] = (UCHAR)((Input[i] >> 16) & 0xff);Output[j+3] = (UCHAR)((Input[i] >> 24) & 0xff);}}/*****************************************************************************************FUNCTION: CMD5Checksum::FinalDETAILS: protectedDESCRIPTION: Implementation of main MD5 checksum algorithm; ends the checksum calculation.RETURNS: CString : the final hexadecimal MD5 checksum result ARGUMENTS: NoneNOTES: Performs the final MD5 checksum calculation ('Update' does most of the work,this function just finishes the calculation.) *****************************************************************************************/CString CMD5Checksum::Final(){ //Save number of bitsBYTE Bits[8];DWordToByte( Bits, m_nCount, 8 );//Pad out to 56 mod 64.UINT nIndex = (UINT)((m_nCount[0] >> 3) & 0x3f);UINT nPadLen = (nIndex < 56) ? (56 - nIndex) : (120 - nIndex);Update( PADDING, nPadLen );//Append length (before padding)Update( Bits, 8 );//Store final state in 'lpszMD5'const int nMD5Size = 16;unsigned char lpszMD5[ nMD5Size ];DWordToByte( lpszMD5, m_lMD5, nMD5Size );//Convert the hexadecimal checksum to a CStringCString strMD5;for ( int i=0; i < nMD5Size; i++) { CString Str;if (lpszMD5[i] == 0) { Str = CString("00");}else if (lpszMD5[i] <= 15) { Str.Format(_T("0%X"),lpszMD5[i]);}else{ Str.Format(_T("%X"),lpszMD5[i]);}ASSERT( Str.GetLength() == 2 );strMD5 += Str;}ASSERT( strMD5.GetLength() == 32 );return strMD5;}/*****************************************************************************************FUNCTION: CMD5Checksum::UpdateDETAILS: protectedDESCRIPTION: Implementation of main MD5 checksum algorithmRETURNS: voidARGUMENTS: BYTE* Input : input blockUINT nInputLen : length of input blockNOTES: Computes the partial MD5 checksum for 'nInputLen' bytes of data in 'Input'*****************************************************************************************/void CMD5Checksum::Update( BYTE* Input, ULONG nInputLen ){ //Compute number of bytes mod 64UINT nIndex = (UINT)((m_nCount[0] >> 3) & 0x3F);//Update number of bitsif ( ( m_nCount[0] += nInputLen << 3 ) < ( nInputLen << 3) ){ m_nCount[1]++;}m_nCount[1] += (nInputLen >> 29);//Transform as many times as possible.UINT i=0; UINT nPartLen = 64 - nIndex;if (nInputLen >= nPartLen) { memcpy( &m_lpszBuffer[nIndex], Input, nPartLen );Transform( m_lpszBuffer );for (i = nPartLen; i + 63 < nInputLen; i += 64) { Transform( &Input[i] );}nIndex = 0;} else {i = 0;}// Buffer remaining inputmemcpy( &m_lpszBuffer[nIndex], &Input[i], nInputLen-i);}CString CMD5Checksum::GetMD5OfString(CString strString){try{ CMD5Checksum MD5Checksum; //checksum object int nLength = strString.GetLength(); //number of bytes read from the file//const int nBufferSize = 1024; //checksum the file in blocks of 1024 bytesBYTE *Buffer; //buffer for data read from the fileBuffer=(BYTE*)(strString.GetBuffer(nLength));//checksum the file in blocks of 1024 bytes//while ((nLength = File.Read( Buffer, nBufferSize )) > 0 )//{ MD5Checksum.Update( Buffer, nLength );//}//finalise the checksum and return itreturn MD5Checksum.Final();}//report any file exceptions in debug mode onlycatch (CFileException* e ){ TRACE0("CMD5Checksum::GetMD5: CFileException caught"); throw e;}}
调用的地方:
m_strFileMD5 = CMD5Checksum::GetMD5(m_strFilePath);
- C语言计算文件的md5值
- C语言计算文件MD5值
- 计算文件MD5 (C++)
- C语言计算文件MD5
- 文件MD5值计算
- [代码实例][C语言]计算文件的MD5值
- C语言实现计算文件和字符串md5值
- 计算文件的md5值
- c++ 计算文件md5值
- 计算文件的MD5值
- C++计算文件MD5值
- Java--计算文件md5值
- 大文件计算MD5值
- 计算文件的MD5值
- 大文件MD5值计算
- 计算文件的MD5值
- 计算文件的 MD5 值
- Java计算文件MD5值
- json_decode无法解析\t的问题
- EAS BOS 通过sql语句 将时间存入到eas系统中
- libtomcrypt库在Windows平台下编译配置和使用
- C语言学习之数列求和
- myeclipse如何设置jsp页面的打开方式
- C++计算文件MD5值
- 完全卸载oracle11g步骤
- 查看修改mysql编码方式
- PL/SQL Developer无法登录问题
- NYOJ6——喷水装置(一)(贪心)
- Webx2源码序列图
- 自己用C++写的简单正则,以后慢慢完善扩充成为一个合格的正则
- 2012第四届华为编程大赛(高级组)第三题
- 获取需要登录的网页信息,session保持方法