发现一个很奇怪的现象:

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. 关于char[]数组通过scanf赋值使用上的一些问题。。

    关于char[]数组通过scanf赋值使用上的一些问题. 假如我们有这么一段代码 #include <stdio.h> int main(void){ char c1[2]; scanf( ...

  2. DBPack SQL Tracing 功能及数据加密功能详解

    上周,我们正式发布了 DBPack SQL Tracing 功能和数据加密功能,现对这两个功能做如下说明. SQL Tracing 通过 DBPack 代理开启的全局事务,会自动在 http head ...

  3. 使用Docker-compose来封装celery4.1+rabbitmq3.7服务,实现微服务架构

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_115 大家都知道,Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统,在之前的一篇文章中:python3.7+Torn ...

  4. Nginx 配置静态资源防盗链

    # 什么是静态资源盗链: # 你服务器上的一张图片,127.0.0.1/images/a.png # 别人的html页面可以直接通过<img src="127.0.0.1/images ...

  5. flutter系列之:flutter架构什么的,看完这篇文章就全懂了

    目录 简介 Flutter的架构图 embedder engine Flutter framework Widgets Widgets的可扩展性 Widgets的状态管理 渲染和布局 总结 简介 Fl ...

  6. 面试突击75:SpringBoot 有几种读取配置文件的方法?

    Spring Boot 中读取配置文件有以下 5 种方法: 使用 @Value 读取配置文件. 使用 @ConfigurationProperties 读取配置文件. 使用 Environment 读 ...

  7. 一文带你认知定时消息发布RocketMQ

    摘要:DMS任意时间定时消息能力发布. DMS是华为云的分布式消息中间件服务.适用于解决分布式架构中的系统解耦.跨系统跨地域数据流通.分布式事务协调等难题,协助构建优雅的现代化应用架构,提供可兼容 K ...

  8. UE蓝图---实现场景物体Transform状态重置效果

    在工业领域应用中,通常会遇到操作场景模型变换的操作,经过了移动.旋转.缩放后,要求可一键重置还原最初的Transform状态. 思路:1.在模型阶段设置每个模型Tag值为Oper,表明是可被操作的对象 ...

  9. 延时任务-基于redis zset的完整实现

    所谓的延时任务给大家举个例子:你买了一张火车票,必须在30分钟之内付款,否则该订单被自动取消.订单30分钟不付款自动取消,这个任务就是一个延时任务. 我之前已经写过2篇关于延时任务的文章: <完 ...

  10. Markdown使用指南

    1. Markdown是什么? Markdown是一种轻量级标记语言,它以纯文本形式(易读.易写.易更改)编写文档,并最终以HTML格式发布. Markdown也可以理解为将以MARKDOWN语法编写 ...