C++ MFC MD5 SHA1 SHA256 | 文件哈希计算器

md5 sha1 sha256 mfc 文件哈希 文件hash

下载链接:

http://www.kuaipan.cn/file/id_13122516658684986.htm

这两天为庆祝考试结束而做,放图:

filehash

 

实现功能有:

1.选择或拖放文件

2.计算文件的md5,sha1,sha256

主要问题有:

1算法问题:

无可避免的第一个问题是三种算法的实现。算法在维基百科上都有详细描述,但主要问题是存放数据的方式,这里纠结了很久。

sha1/256存放数据的方式很特别,它是按每4字节为单位小端存储存放的,例如文件内容是“abc”三个字符,那么sha系列组织文件的格式在内存里是80 63 62 61,当成无符号整型输出才是61 62 63 80.这里十分坑爹啊,要对所有的输入都进行每4字节的小端调换。最后文件大小(bit为单位)使用的是8位的无符号整型存储,但你直接把最后八位当成unsigned __int64存储,这时内存里是(18 00 00 00 00 00 00 00),但不行,要前后要调换过来,在内存里是(00 00 00 00 18 00 00 00 )。很坑爹吧?

最后总结得出:sha系列的存放格式你就按照16个无符号整型来打印,最后结果能符合文件原来应有的格式,那就对了。还是拿“abc”来做例子,最后组织完的512位,按每32位一个无符号整型输出结果是:(61 62 63 80 00 00 00 00 ….. 00 00 00 00 00 00 00 18),但其实在内存里他们是(80 63 62 61 00 00 00 00 ….. 00 00 00 00 18 00 00 00)。

我是先搞的sha1,纠结在这里纠结了很久,最后发现如此坑爹,于是去做md5,以为md5跟sha1一样也是坑爹的存储方式(因为在网上他们的存储方式描述是一摸一样的),但后来出来结果不正确,搞了N久才发现,md5是用正常的存放方式的,意思是”abc”这样的文件,在内存就直接是(61 62 63 80 00 00 00 00 ….. 18 00 00 00 00 00 00 00),不需要做什么坑爹调换。

真的很坑爹,不过还好,经过这次以后,对数据存放,大端存储小端存储什么的都有了一定了解了,也算是被坑的回报吧。

2.效率问题

三种算法都是以512位为单位,将文件切割来计算的,但如果每次IO都只读取512位,那频繁的io会使程序十分慢。我的做法是一次io从磁盘上读取10M数据放内存里,再对这部分进行计算,这样效率就不会受频繁io影响。不过这里就有一些额外的情况需要处理,逻辑会变得复杂点,不过没什么好讲的,自己做做就知道。

3.边界问题

当数据大小(字节)%64 大于55时,这种情况下补一个80就不够存文件大小了,文件大小在要一个新的512位里面在最后放置,这个bug开始实现时没注意到。

4.界面问题

界面其实没啥新内容,选择文件,多线程计算,进度条控制这些之前代码统计器都做过,就是多了个拖放功能,但其实只是响应个消息而已。

 

好了,差不多就这样子,这次没怎么测试过就放上来了,如果有bug请多多见谅并通知小弟,欢迎交流。

 

2011.06.24  sitar发现一个bug,我还是太嫩了。

Tagged , , , , , , . Bookmark the permalink.

3 Responses to C++ MFC MD5 SHA1 SHA256 | 文件哈希计算器

发表评论

邮箱地址不会被公开。 必填项已用*标注