利用 Windows Crypt API 获取 MD5/SHA1 值

昨天有人给了我一段据说是根据网上的 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以内,再大就不仅不会快,反而更慢,大概就是俗话“贪多嚼不烂”的道理吧

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值