工作之中,同事用到了MD5信息摘要算法,但是一直没搞定。几个人找我咨询,我也没接触过。简单拿测试的例子试了一下linux shell中带有的md5sum,发现计算的结果并不一致,看起来这个并不是我之前接触的MD5算法。但是,受益于互联网的便捷,我简单搜索很快就锁定了一个似乎可以尝试的目标。这是一个开源的MD5算法实现,正好是面向我需要处理的问题。相关的链接:A portable, fast, and free implementation of the MD5 Message-Digest Algorithm (RFC 1321) [Openwall Community Wiki]
比较有意思的是,这个网页的实现居然是一个WiKi,而我最近刚好帮公司搭建了一个WiKi系统,突然间觉得又多了积分亲切。
对代码进行了一个测试,想看看输入的格式应该按照什么来处理。我分别按照字符串、十六进制单数值、十六进制的无符号8bit、无符号的表征的十六进制字符数值等几种方式作为输入来进行测试。以下是我所进行的测试:
测试比较顺利,很快就撞出来了跟我预期一致的结果。这个算法之前给我的测试的例子,输入的其实是每2个字符组合为一个十六进制的数值。先看一下运行的结果,之后再看看每一个接口的使用。
以上是我测试出来的结果。
接下来看看这个模块的相关接口,其实还是很简单的。
首先是一个初始化,用到接口MD5_Init(),这个初始化会初始化掉计算所用到的一个结构体。我这里定义为了一个全局变量,其实这个也不见得必须用全局变量。
接下来是实际的MD5信息摘要计算,计算完成后提取结果,计算的结果会存储到第一个指针参数所指向的位置。MD5_Update()是用于MD5计算的主要的接口函数,而MD5_Final()接口则是把已经存储到了前面定义的结构体中的计算结果组合输出出来。
接口非常清晰简单,最后的结果是一个十六进制的存储结果,这个其实也是我测试出来的。按照字符串、字符以及正确的结果等几种可能的方式都做了测试,最终找到的一个正确的解释方式。
以后,不知道这个小工具是否还会不断从工具箱里面拿出来使用。但是感觉上这个有点之前收集到的CRC的感觉,值得收纳。
标签:十六进制,结果,1582,可移植,接口,算法,测试,MD5 From: https://blog.51cto.com/greyzhang/6021493