MD5消息摘要算法(英语: MD5 Message-Digest Algorithm), 主要用于确保信息传输过程的一致性校验。
 
首先介绍两个工具:
window: WinMD5Free
Linux: md5sum
这两个工具的作用是验证自己写的程序获取MD5是否正确。
 
先上一段错误代码:
 string getFileMd5(const string& file)
{
MD5 md5;
ifstream f(file.c_str(), ios_base::binrary);
char buffer[ * ];
while (!f.eof())
{
f.read(buffer, sizeof(buffer));
size_t length = strlen(buffer);
md5.update(buffer, length);
}
return md5.md5();
}
逻辑上,看似没有问题的一段代码。
实际验证的情况:
window下获取的MD5与第三方获取的值一致;
linux下获取的MD5与第三方获取的值不一致。
也就是说计算MD5时的输入不一致,导致的结果不一致。
 
问题分析:
上面的代码最有可能出问题的地方在用strlen获取buffer的大小。strlen以‘\0’标志确定函数读取终止。从文件中读取的二进制数据中间是可能存在‘\0’的情况,打印每次strlen返回的结果,可以验证这个情况。
 
问题的原因已经找到,那么如何解决这个问题呢?
如果你熟悉C++ IO操作,io库已经考虑过这个问题。获取每次读取的大小,使用fstream.gcount()返回正确读取大小。
 
正确的代码
 string getFileMd5(const string& file)
{
MD5 md5;
ifstream f(file.c_str(), ios_base::binrary);
char buffer[ * ];
while (!f.eof())
{
f.read(buffer, sizeof(buffer));
md5.update(buffer, f.gcount());
}
return md5.md5();
}
工作中遇到这样的问题,经历过多次尝试才发现这个问题,在此处记录下。

window/linux下获取文件MD5的更多相关文章

  1. 怎样在windows下和linux下获取文件(如exe文件)的具体信息和属性

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/xmt1139057136/article/details/25620685 程序猿都非常懒.你懂的! ...

  2. linux 下获取文件最后几行

    在Linux下,获取文件倒数几行的命令是: tail -n 10 your_filename     #获取倒数10行

  3. C#在Linux下获取文件夹信息(所在磁盘总大小,使用空间,已用空间,使用率)

    1.第一种使用shell命令实现: private DiskInfo LinuxGetFolderDiskInfo(string path) { DiskInfo disk = new DiskInf ...

  4. linux下各文件夹的结构说明及用途介绍

    linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令.   /dev:设备特殊文件.   /etc:系统管理和配置文件.   /etc/rc.d:启动的配 置文件和脚本.   /ho ...

  5. 【转】linux下各文件夹的结构说明及用途介绍

    linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令. /dev:设备特殊文件. /etc:系统管理和配置文件. /etc/rc.d:启动的配 置文件和脚本. /home:用户主目录 ...

  6. Linux下各文件夹的结构说明及用途介绍(转载)

    linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令. /dev:设备特殊文件. /etc:系统管理和配置文件. /etc/rc.d:启动的配 置文件和脚本. /home:用户主目录 ...

  7. linux下各文件夹的结构说明及用途介绍:Linux目录结构介绍

    linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令. /dev:设备特殊文件. /etc:系统管理和配置文件. /etc/rc.d:启动的配 置文件和脚本. /home:用户主目录 ...

  8. 【原创】Linux下获取命令的帮助与常用命令

    Linux中的shell命令一般是执行步骤:用户在终端输入命令回车,系统内核会在当前用户的环境变量PATH中去读取环境变量的值 变量的值就是命令的路径,命令路径不只一个,于是系统会从这些路径中从左至右 ...

  9. Linux 下获取LAN中指定IP的网卡的MAC(物理地址)

    // all.h// 2005/06/20,a.m. wenxy #ifndef _ALL_H#define _ALL_H #include <memory.h>#include < ...

随机推荐

  1. .Net下Redis使用注意事项

    .Net下Redis使用注意事项 注:Redis的安装方法和桌面端工具很多,不在本文讨论范围内. 一:不结合适用场景的技术都是耍流氓,Redis主要适用场景: 简单字符串缓存 简单队列 简单发布订阅 ...

  2. Hibernate中的一对一注解配置

    Card类 package cn.OneToOne2017109.entity; import javax.persistence.*; /** * Created by YSS on 2017/10 ...

  3. css中的单位和css中的颜色表示方法

    css中颜色的表示方式: 图片来源http://www.w3school.com.cn

  4. 牛客提高R5 A.同余方程

    题意 题目链接 Sol 设\(solve(x, y)\)表示\(i \in [0, x], j \in [0, y]\)满足题目要求的方案数 首先容斥一下,\(ans = solve(r_1, r_2 ...

  5. Canvas知识点汇总

    本文主要记录Canvas基础知识汇总. 1.Canvas定义 <canvas> 元素是HTML5中的新元素,通过它可以在网页中绘制出所需的图形.<canvas>标签只是图形的容 ...

  6. CSS3媒体查询总结

    1.什么是媒体查询 媒体查询可以让我们根据设备显示器的特性(如视口宽度.屏幕比例.设备方向:横向或纵向)为其设定CSS样式,媒体查询由媒体类型和一个或多个检测媒体特性的条件表达式组成.媒体查询中可用于 ...

  7. Microsoft BI - SSRS

    1. Shared Dataset 功能在 SQL Server 2008 R2 / 2012 / 2014 的下列三个版本中不支持,详情请参考此处: Express Edition with Adv ...

  8. 【Leetcode】【Easy】Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  9. 2.LVS配置过程

    请查看我的有道云笔记: http://note.youdao.com/noteshare?id=866edb5736418d29c86d68b5198c5c1c&sub=66F88F0A24D ...

  10. 笔记本win8系统共享wifi上网方法

    华硕笔记本电脑,安装了win8系统,使用wifi上网,由于连接无线路由的机器太多,超过路由连接数上限,因此转为使用笔记本共享wifi方式给手机上网. 最终上网方式为: 笔记本网卡接入无线路由器上网,笔 ...