取文件MD5 WINAPI
1 #include <windows.h> 2 #include <wincrypt.h> 3 #include <stdio.h> 4 5 BOOL GetFileHash(LPCSTR lpFileName, LPSTR lpHash) 6 { 7 BOOL bResult = FALSE; 8 9 HANDLE hFile = CreateFile(lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 10 11 if (hFile != INVALID_HANDLE_VALUE) 12 { 13 DWORD dwFileSize = GetFileSize(hFile, NULL); 14 15 if (dwFileSize > 0) 16 { 17 PBYTE lpBuffer = (PBYTE)VirtualAlloc(NULL, dwFileSize, MEM_COMMIT, PAGE_READWRITE); 18 19 if (lpBuffer != NULL) 20 { 21 DWORD dwNumOfRead; 22 23 if (ReadFile(hFile, lpBuffer, dwFileSize, &dwNumOfRead, NULL) != FALSE) 24 { 25 HCRYPTPROV hProv; 26 27 if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) != FALSE) 28 { 29 HCRYPTHASH hHash; 30 31 if (CryptCreateHash(hProv, CALG_MD5, NULL, NULL, &hHash) != FALSE) 32 { 33 if (CryptHashData(hHash, lpBuffer, dwFileSize, NULL) != FALSE) 34 { 35 BYTE bData[16]; DWORD dwDataLen; 36 37 if (CryptGetHashParam(hHash, HP_HASHVAL, bData, &dwDataLen, NULL) != FALSE) 38 { 39 if (dwDataLen == 16) 40 { 41 LPSTR lpStr = lpHash; 42 43 for (DWORD i = 0; i < dwDataLen; i++, lpStr += 2) 44 { 45 sprintf(lpStr, "%02X", bData[i]); 46 } 47 48 bResult = TRUE; 49 } 50 } 51 } 52 53 CryptDestroyHash(hHash); 54 } 55 56 CryptReleaseContext(hProv, NULL); 57 } 58 } 59 60 VirtualFree(lpBuffer, 0, MEM_RELEASE); 61 } 62 } 63 64 CloseHandle(hFile); 65 } 66 67 return bResult; 68 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用