发现一个很奇怪的现象:

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)的更多相关文章

  1. python hash 哈希值

    自增知识点 1,哈希 什么是可哈希(hashable)? 简要的说可哈希的数据类型,即不可变的数据结构(字符串str.元组tuple.对象集objects). 哈希有啥作用? 它是一个将大体量数据转化 ...

  2. Python max()方法扩展:求字典中值最大的键

    重要的应该写在前面[捂脸]   场景一:仅求最大值对应的键,代码如下: >>> dic = {'A':4, 'B':2, 'C':3} >>> max_key = ...

  3. C# 计算字符串/文件的哈希值(MD5、SHA)

    原文 C# 计算字符串的哈希值(MD5.SHA) 已做修改 一.关于本文 本文中是一个类库,包括下面几个函数: /// 1)计算32位MD5码(大小写):Hash_MD5_32 /// 2)计算16位 ...

  4. c# 获取文件本身的哈希值

    1. 哈希值是什么 我个人认为,哈希值是一个统称,也就是经过加密算法后得出的长度较短.位数固定的输出序列即散列值,这个哈希值是一个凭证,一个数字签名之类的,唯一对应你加密之前的东西,这都是我自个儿觉得 ...

  5. 理解 Redis(5) - 哈希值

    哈希值存储示意图:首先, 我想先认真理解一下哈希值的数据结构:前面讲过, redis 存储的是键值对, 键永远都是可以打印的 ASCII 码, 值是字符串, 或者是以其他形式包裹的字符串. 上两节介绍 ...

  6. QCryptographicHash实现哈希值计算,支持多种算法

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QCryptographicHash实现哈希值计算,支持多种算法     本文地址:http: ...

  7. python学习——函数返回值及递归

    返回值 return语句是从python 函数返回一个值,在讲到定义函数的时候有讲过,每个函数都要有一个返回值.Python中的return语句有什么作用,今天小编就依目前所了解的讲解一下.pytho ...

  8. Python实现哈希表(分离链接法)

    一.python实现哈希表 只使用list,构建简单的哈希表(字典对象) # 不使用字典构造的分离连接法版哈希表 class HashList(): """ Simple ...

  9. win10下计算文件哈希值的方法

    cmd下使用certutil命令 使用方法: certutil -hashfile FILE_NAME ALGORITHM_NAME 支持的加密算法包括:MD2,MD4,MD5,SHA1,SHA256 ...

随机推荐

  1. linux docker .net core 从建立网站到预览

    docker的安装在网上一搜一大把,windows安装的就是exe双击,linux安装需要执行语句 ps:需要准备xftp.xshell.vs 2019.linux服务器.docker账号密码 例如: ...

  2. windows下memcache安装

    Windows下的Memcache安装:1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:memcached2. 在终端(也即cmd命令界面)下输入 'c:memcache ...

  3. 关于KeyFile的破解,含注册机源代码

    程序来自于<加密与解密3>的第五章的PacMe.exe.书中并没有给出C语言实现的加密与解密代码,自己花了一些时间,把代码还原了,并且写了一个C语言的注册机. 加密原理:正如书中所说,此程 ...

  4. 解读Gartner2022年组装式应用报告:从组装式企业到组装式应用

    摘要:"到2023年,采用组装式方法的组织在新特性交付速度比竞争对手快80%."Gartner 为什么未来的企业是组装式的? 物竞天择,适者生存,企业也是一样,在发展过程中,会为了 ...

  5. Spring Boot部署方法

    Spring Boot部署方法     网上搜到的部署方法无非是打成jar包,然后shell执行nohup java调用jar命令,或者是打成war包然后部署到tomcat或者jetty容器上面. S ...

  6. 一例智能网卡(mellanox)的网卡故障分析

    一例智能网卡(mellanox)的网卡故障分析 背景:这个是在centos 7.6.1810的环境上复现的,智能网卡是目前很多 云服务器上的网卡标配,在oppo主要用于vpc等场景,智能网卡的代码随着 ...

  7. 【java】学习路径16-重写Object方法(equals()等)

    在平时开发中,想要比较自定义类对象中的特定成员时,我们需要逐一手动比较,非常不方便. 举个栗子,我们有两个cafe对象,我们想比较两杯咖啡的价格是否一样,一般来说我们使用getter()来比较,但是这 ...

  8. 究竟什么是Shadow DOM?

    shadow dom 是什么? 顾名思义,shadow dom直译的话就是影子dom,但我更愿把它理解为DOM中的DOM.因为他能够为Web组件中的 DOM和 CSS提供了封装,实际上是在浏览器渲染文 ...

  9. Spire.Cloud 私有化部署教程(三) - Windows 系统

    本教程主要介绍如何在 Windows 系统上实现 Spire.Cloud 私有化部署. 详细步骤如下: 一.安装依赖 我们的私有部署的依赖有 Nodejs.MySQL.Redis 和 RabbitMQ ...

  10. 如何不编写 YAML 管理 Kubernetes 应用?

    Kubernetes 将自身边界内的事物都抽象为资源.其中的主要部分,是以 Deployment.StatefulSet 为代表的 workload 工作负载控制器,其他各类资源都围绕这些主要的资源工 ...