利用 Windows Crypt API 获取 MD5/SHA1 值

来源:互联网 发布:东东数据cf刷枪好用么 编辑:程序博客网 时间:2024/05/22 23:19

昨天有人给了我一段据说是根据网上的 java 程序改编的计算 md5 值的 vfp 代码,他说与他使用 md5 计算工具得到的 md5 值不同,想让我看看是哪里改编时出了问题。粗略看了一下,其实这段代码十分眼熟,在 csdn 的 vfp 讨论区中就曾出现过,只是我以前没有需要,所以都是一眼而过,但对那段长长的 hash 变换表却印象深刻。由于我也不知道具体的 md5 值算法,所以也只能先看那段 java 代码,并未发现转换中有何不妥之处。转念一想,Windows Crypt API 中不是也有计算 hash 值的函数吗?只是以前没用过,不熟悉,打开 msdn 找到 Crypt API 这一篇仔细阅读,再参考网上的一些资料,于是有了下面这段代码。 

兼回答 tszsc 朋友的问题:
另一种常见的文件/字符串校验方法是SHA1(也称SHA160),它产生的是160/8=20个字节的验证码,比MD5的16个字节稍长一点,只需将上面的代码稍作改造即可实现:
1. 加一个常量定义:#define CALG_SHA1    0x00008004
2. 将 lcHashValue = REPL... 这一句中的 16 改为 20
3. 将调用 CryptCreateHash 函数的第二个参数改成 CALG_SHA1
函数名改为 GetSHA1,如果你有空的话,将错误提示和注释中的 MD5 字样也改过来就更好了。

 

回答 cslx0810 朋友

这个问题提得有道理,我原来没想将这个函数用来计算超大文件,只想偶尔用来校验一些小数据量的值
下面是可以计算超大文件 md5 值的示例代码,是在上面代码的基础上做了少量修改
我的电脑比较差,用这段代码来计算一个700M的光盘ISO映像文件,用时一般在30秒左右
不过这可能除了跟 CPU/RAM 有关以外,跟文件是否有碎片以及硬盘速度也有很大关系
另外,代码中 BYTES_PER_READ 常量的取值也会对整个计算速度产生较大的影响
我试验的结果是一般要控制在256kb以内,再大就不仅不会快,反而更慢,大概就是俗话“贪多嚼不烂”的道理吧