发现一个很奇怪的现象:

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. MyBatis-通用Mapper-tk.mybatis的使用

    MyBatis-通用Mapper[更新中] tk.mybatis的使用 前言 使用MyBatis开发,如果是普通是同MyBatis进行开发,那么就需要在xml文件中编写大量的SQL.当数据库表结构发生 ...

  2. 王霸雄图荣华敝屣,谈笑间尽归尘土|基于Python3双队列数据结构搭建股票/外汇交易匹配撮合系统

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_192 如果你爱他,那么送他去股市,因为那里是天堂:如果你恨他,送他去股市,因为那里是地狱. 在过去的一年里,新冠疫情持续冲击世界经 ...

  3. 一文搞懂│php 中的 DI 依赖注入

    目录 什么是 DI / 依赖注入 依赖注入出现的原因 简单的依赖注入 高阶的依赖注入 依赖注入的应用 依赖注入高阶优化 什么是 DI / 依赖注入 依赖注入DI 其实本质上是指对类的依赖通过构造器完成 ...

  4. 面试突击71:GET 和 POST 有什么区别?

    GET 和 POST 是 HTTP 请求中最常用的两种请求方法,在日常开发的 RESTful 接口中,都能看到它们的身影.而它们之间的区别,也是一道常见且经典的面试题,所以我们本文就来详细的聊聊. H ...

  5. Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  6. 6.15 NOI 模拟

    \(T1\ ckr\)与平方数 不会吧,不会吧,真有人不会积分,好吧,我真的一点也不会... 基本公式\(:\) \(1.\)多项式定积分的计算方法 \[f(x)=\sum_{i=0}^nc_ix^i ...

  7. 理解vue中v-for循环中得key原理及一些错误

    作用:给节点做一个标识,相当于人类的身份证号,虚拟DOM中的标识 下列是key值的一些使用场景和带来的问题:   js:    const vm = new Vue({             el: ...

  8. 美女 Committer 手把手教你使用海豚调度

    还在为选哪个调度发愁么?还在为查使用手册愁眉不展么?来来来,先瞧一眼海豚调度的 Slogan:调度选的好,下班回家早.调度用的对,半夜安心睡.为充分贯彻这一宗旨,海豚调度一条龙服务来了,特地邀请海豚社 ...

  9. java-RandomAccessFile操作以及IO流简单使用

    1.1RandomAccessFile--使用RAF读写基本类型数据,以及了解Raf的指针操作 write有相对应的写入基本类型的方法 void seek(Long pos)调整RAF指针位置,可以在 ...

  10. 实践分享!GitLab CI/CD 快速入门

    用过 GitLab 的同学肯定也对 GitLab CI/CD 不陌生,GitLab CI/CD 是一个内置在 GitLab 中的工具,它可以帮助我们在每次代码推送时运行一系列脚本来构建.测试和验证代码 ...