C++/python求哈希值(SHA256)
发现一个很奇怪的现象:
python语言求哈希值所用时间竟然比C++少:
C++ code
1 #include "stdafx.h"
2 #include <windows.h>
3 #include <time.h>
4 #include <iostream>
5 void ShowError(char *pszText)
6 {
7 char szErr[MAX_PATH] = { 0 };
8 ::sprintf_s(szErr, "%s Error[%d]\n", pszText, ::GetLastError());
9 #ifdef _DEBUG
10 // required size
11 int size = MultiByteToWideChar(CP_UTF8, 0, szErr, -1, NULL, 0);
12 wchar_t *pwcsName = new wchar_t[size];
13 MultiByteToWideChar(CP_UTF8, 0, szErr, -1, (LPWSTR)pwcsName, size);
14 ::MessageBox(NULL, pwcsName, L"ERROR", MB_OK | MB_ICONERROR);
15 delete[] pwcsName;
16 #endif
17 }
18
19
20 BOOL GetFileData(char *pszFilePath, BYTE **ppFileData, DWORD *pdwFileDataLength)
21 {
22 BOOL bRet = TRUE;
23 BYTE *pFileData = NULL;
24 DWORD dwFileDataLength = 0;
25 HANDLE hFile = NULL;
26 DWORD dwTemp = 0;
27
28 do
29 {
30 // required size
31 int size = MultiByteToWideChar(CP_UTF8, 0, pszFilePath, -1, NULL, 0);
32 wchar_t *pwcsName = new wchar_t[size];
33 MultiByteToWideChar(CP_UTF8, 0, pszFilePath, -1, (LPWSTR)pwcsName, size);
34 hFile = ::CreateFile(pwcsName, GENERIC_READ | GENERIC_WRITE,
35 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
36 FILE_ATTRIBUTE_ARCHIVE, NULL);
37 delete[] pwcsName;
38 if (INVALID_HANDLE_VALUE == hFile)
39 {
40 bRet = FALSE;
41 ShowError("CreateFile");
42 break;
43 }
44
45 dwFileDataLength = ::GetFileSize(hFile, NULL);
46
47 pFileData = new BYTE[dwFileDataLength];
48 if (NULL == pFileData)
49 {
50 bRet = FALSE;
51 ShowError("new");
52 break;
53 }
54 ::RtlZeroMemory(pFileData, dwFileDataLength);
55
56 ::ReadFile(hFile, pFileData, dwFileDataLength, &dwTemp, NULL);
57
58 // 返回
59 *ppFileData = pFileData;
60 *pdwFileDataLength = dwFileDataLength;
61
62 } while (FALSE);
63
64 if (hFile)
65 {
66 ::CloseHandle(hFile);
67 }
68
69 return bRet;
70 }
71
72
73 BOOL CalculateHash(BYTE *pData, DWORD dwDataLength, ALG_ID algHashType, BYTE **ppHashData, DWORD *pdwHashDataLength)
74 {
75 HCRYPTPROV hCryptProv = NULL;
76 HCRYPTHASH hCryptHash = NULL;
77 BYTE *pHashData = NULL;
78 DWORD dwHashDataLength = 0;
79 DWORD dwTemp = 0;
80 BOOL bRet = FALSE;
81
82
83 do
84 {
85 // 获得指定CSP的密钥容器的句柄
86 bRet = ::CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
87 if (FALSE == bRet)
88 {
89 ShowError("CryptAcquireContext");
90 break;
91 }
92
93 // 创建一个HASH对象, 指定HASH算法
94 bRet = ::CryptCreateHash(hCryptProv, algHashType, NULL, NULL, &hCryptHash);
95 if (FALSE == bRet)
96 {
97 ShowError("CryptCreateHash");
98 break;
99 }
100
101 // 计算HASH数据
102 bRet = ::CryptHashData(hCryptHash, pData, dwDataLength, 0);
103 if (FALSE == bRet)
104 {
105 ShowError("CryptHashData");
106 break;
107 }
108
109 // 获取HASH结果的大小
110 dwTemp = sizeof(dwHashDataLength);
111 bRet = ::CryptGetHashParam(hCryptHash, HP_HASHSIZE, (BYTE *)(&dwHashDataLength), &dwTemp, 0);
112 if (FALSE == bRet)
113 {
114 ShowError("CryptGetHashParam");
115 break;
116 }
117
118 // 申请内存
119 pHashData = new BYTE[dwHashDataLength];
120 if (NULL == pHashData)
121 {
122 bRet = FALSE;
123 ShowError("new");
124 break;
125 }
126 ::RtlZeroMemory(pHashData, dwHashDataLength);
127
128 // 获取HASH结果数据
129 bRet = ::CryptGetHashParam(hCryptHash, HP_HASHVAL, pHashData, &dwHashDataLength, 0);
130 if (FALSE == bRet)
131 {
132 ShowError("CryptGetHashParam");
133 break;
134 }
135
136 // 返回数据
137 *ppHashData = pHashData;
138 *pdwHashDataLength = dwHashDataLength;
139
140 } while (FALSE);
141
142 // 释放关闭
143 if (FALSE == bRet)
144 {
145 if (pHashData)
146 {
147 delete[]pHashData;
148 pHashData = NULL;
149 }
150 }
151 if (hCryptHash)
152 {
153 ::CryptDestroyHash(hCryptHash);
154 }
155 if (hCryptProv)
156 {
157 ::CryptReleaseContext(hCryptProv, 0);
158 }
159
160 return bRet;
161 }
162
163
164 int _tmain(int argc, _TCHAR* argv[])
165 {
166 BYTE *pData = NULL;
167 DWORD dwDataLength = 0;
168 DWORD i = 0;
169 BYTE *pHashData = NULL;
170 DWORD dwHashDataLength = 0;
171
172 // 读取文件数据
173 GetFileData("C:\\Users\\Administrator\\Desktop\\paraseLED\\white\\process.exe", &pData, &dwDataLength);
174
175 // MD5
176 CalculateHash(pData, dwDataLength, CALG_MD5, &pHashData, &dwHashDataLength);
177 printf("MD5[%d]\n", dwHashDataLength);
178 for (i = 0; i < dwHashDataLength; i++)
179 {
180 printf("%x", pHashData[i]);
181 }
182 printf("\n\n");
183 if (pHashData)
184 {
185 delete[]pHashData;
186 pHashData = NULL;
187 }
188
189 // SHA1
190 CalculateHash(pData, dwDataLength, CALG_SHA1, &pHashData, &dwHashDataLength);
191 printf("SHA1[%d]\n", dwHashDataLength);
192 std::string hash_ = "";
193 for (i = 0; i < dwHashDataLength; i++)
194 {
195 char temp[32] = { 0 };
196 sprintf_s(temp, "%x", pHashData[i]);
197 hash_.append(temp);
198 printf("%x", pHashData[i]);
199 }
200 printf("\n\n");
201 std::cout << hash_.c_str() << std::endl;
202 printf("\n\n");
203 if (pHashData)
204 {
205 delete[]pHashData;
206 pHashData = NULL;
207 }
208
209 // SHA256
210 clock_t start, end;
211 start = clock();
212 CalculateHash(pData, dwDataLength, CALG_SHA_256, &pHashData, &dwHashDataLength);
213 printf("SHA256[%d]\n", dwHashDataLength);
214 for (i = 0; i < dwHashDataLength; i++)
215 {
216 printf("%x", pHashData[i]);
217 }
218 end = clock();
219 printf("\n\n");
220 printf("timestamp = %f\n", double(end - start) / CLOCKS_PER_SEC);
221 if (pHashData)
222 {
223 delete[]pHashData;
224 pHashData = NULL;
225 }
226
227 system("pause");
228 return 0;
229 }
python code
1 # Python program to find SHA256 hexadecimal hash string of a file
2 import hashlib
3 import time
4
5 start = time.time()
6 filename = r'C:\Users\Administrator\Desktop\paraseLED\white\process.exe'
7 with open(filename,"rb") as f:
8 bytes = f.read() # read entire file as bytes
9 readable_hash = hashlib.sha256(bytes).hexdigest();
10 print(readable_hash)
11 end = time.time()
12 print('timestamp = {}'.format(end - start))

C++/python求哈希值(SHA256)的更多相关文章
- python hash 哈希值
自增知识点 1,哈希 什么是可哈希(hashable)? 简要的说可哈希的数据类型,即不可变的数据结构(字符串str.元组tuple.对象集objects). 哈希有啥作用? 它是一个将大体量数据转化 ...
- Python max()方法扩展:求字典中值最大的键
重要的应该写在前面[捂脸] 场景一:仅求最大值对应的键,代码如下: >>> dic = {'A':4, 'B':2, 'C':3} >>> max_key = ...
- C# 计算字符串/文件的哈希值(MD5、SHA)
原文 C# 计算字符串的哈希值(MD5.SHA) 已做修改 一.关于本文 本文中是一个类库,包括下面几个函数: /// 1)计算32位MD5码(大小写):Hash_MD5_32 /// 2)计算16位 ...
- c# 获取文件本身的哈希值
1. 哈希值是什么 我个人认为,哈希值是一个统称,也就是经过加密算法后得出的长度较短.位数固定的输出序列即散列值,这个哈希值是一个凭证,一个数字签名之类的,唯一对应你加密之前的东西,这都是我自个儿觉得 ...
- 理解 Redis(5) - 哈希值
哈希值存储示意图:首先, 我想先认真理解一下哈希值的数据结构:前面讲过, redis 存储的是键值对, 键永远都是可以打印的 ASCII 码, 值是字符串, 或者是以其他形式包裹的字符串. 上两节介绍 ...
- QCryptographicHash实现哈希值计算,支持多种算法
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QCryptographicHash实现哈希值计算,支持多种算法 本文地址:http: ...
- python学习——函数返回值及递归
返回值 return语句是从python 函数返回一个值,在讲到定义函数的时候有讲过,每个函数都要有一个返回值.Python中的return语句有什么作用,今天小编就依目前所了解的讲解一下.pytho ...
- Python实现哈希表(分离链接法)
一.python实现哈希表 只使用list,构建简单的哈希表(字典对象) # 不使用字典构造的分离连接法版哈希表 class HashList(): """ Simple ...
- win10下计算文件哈希值的方法
cmd下使用certutil命令 使用方法: certutil -hashfile FILE_NAME ALGORITHM_NAME 支持的加密算法包括:MD2,MD4,MD5,SHA1,SHA256 ...
随机推荐
- vscode problem
1.Inconsistent use of tabs and spaces in indentation 原因:tab和空格键不能同时使用 vs code按住ctrl + p,输入以下内容 >c ...
- python opencv图像识别(相同大小图片)
简介 由于项目需要对比两张相同图片的相似度,因此采用opencv将图片转为灰阶数组,然后对比相应的数组来取相似度,此方法只适用于大小相同的图片,较为局限 # -*- coding: utf-8 -*- ...
- 利用DockerHub在Centos7.7环境下部署Nginx反向代理Gunicorn+Flask独立架构
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_165 上一篇文章:Docker在手,天下我有,在Win10系统下利用Docker部署Gunicorn+Flask打造独立镜像,是在 ...
- layui框架图片上传至服务器
注意:只可用于数据量较小的项目,数据量庞大的项目不要用这个,否则会造成图片数量庞大,至服务器运行速度变慢或瘫痪 HTML代码 //前端使用的是layui框架<div class="la ...
- 层次分明井然有条,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang包管理机制(package)EP10
Go lang使用包(package)这种概念元素来统筹代码,所有代码功能上的可调用性都定义在包这个级别,如果我们需要调用依赖,那就"导包"就行了,无论是内部的还是外部的,使用im ...
- Taurus.MVC 微服务框架 入门开发教程:项目部署:2、让Kestrel支持绑定多个域名转发,替代Ngnix使用。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- zabbix 报表动作日志 报错”503“
- Python小游戏——外星人入侵(保姆级教程)第一章 01创建Pygame窗口 02创建设置类Setting()
系列文章目录 第一章:武装飞船 01:创建Pygame窗口以及响应用户输入 02:创建设置类Setting() 一.前期准备 1.语言版本 Python3.9.0 2.编译器 Pycharm2022 ...
- HCNP Routing&Switching之端口安全
前文我们了解了二层MAC安全相关话题和配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16618201.html:今天我们来聊一聊mac安全的综合解决方案端 ...
- 【java】学习路径19-Math类、BigDecimal的使用
1--Math类简单的东西 //一些常数 show(Math.PI); show(Math.E); //四舍五入 show(Math.round(3.4)); show(Math.round(3.6) ...