现在的位置: 首页 > 综合 > 正文

thrift之compiler源码详解-MD5

2018年03月30日 ⁄ 综合 ⁄ 共 1003字 ⁄ 字号 评论关闭

      MD5的实现在md5.c文件里,它在compiler的作用是为了生成structure 和enum类型的fingerprinter,但fingerprinter暂没发现有何作用,哪位大牛若知道,请告知一下,谢谢!

     好了,下面简单介绍一下MD5的实现。

    MD5算法原理可查看:http://blog.csdn.net/whycold/article/details/8046271

    实现主要由四个函数组成:

 (1)md5_init函数

         该函数很简单,只有五行,初始化链接变量A、B、C、D,和信息位长,保存在md5_state_t类型的变量里。

(2)md5_process函数

        这个函数较为复杂些,它是实现MD5算法的四轮运算,如下所示:

  FF(a,b,c,d,Mj,s,ti)表示 a = b + ((a + F(b,c,d) + Mj + ti) << s)

  GG(a,b,c,d,Mj,s,ti)表示 a = b + ((a + G(b,c,d) + Mj + ti) << s)

  HH(a,b,c,d,Mj,s,ti)表示 a = b + ((a + H(b,c,d) + Mj + ti) << s)

  Ⅱ(a,b,c,d,Mj,s,ti)表示 a = b + ((a + I(b,c,d) + Mj + ti) << s)

        其中Mj表示消息(64位)的第j个子分组(从0到15),-个分组由4位组成;常数ti是4294967296*abs(sin(i))的整数部分,i取值从1到64,单位是弧度。相对于512位的消息位长,它是缩小版。这里对大小端字节序作了不同处理。

(3)md5_append函数

       该函数是添加消息字节数据,这里有个全局缓存,缓存里缓存字数节%64部份是未进行四轮运算的,该部份与新添加的字节数据结合,并每隔64位作一次四轮运算,即调用md5_process函数,最后不够64位的剩余数据保存到缓存里,留作下次处理。

(4)md5_finish函数

       该函数最终会生成MD5值,即MD5算法在此结束。这函数首先是填充信息使其位长为512,填充方法:在信息的后面填充一个1和无数个0至448位,接着在这个结果后面附加一个以64位二进制表示的填充前信息长度;然后调用两次md5_append函数进行四轮运算;最后返回16位的MD5值。

 

PS:MD5算法里巧秒地用了好多位转移运算符(如:<< , >>)。

 

 

抱歉!评论已关闭.