由汇编内核的MD5算法编写谈代码优化

http://tech.ddvip.com   2007年03月16日    社区交流

本文详细介绍由汇编内核的MD5算法编写谈代码优化

  跳出循环

  output的内存排列顺序为

  +--+--+--+--+--

  |33|32|31|30|

  +--+--+--+--+--

  ^

  output

  现在大家注意了,input的排列顺序是什么?由计算机原理可知道,在计算机内部,数据的存放顺序是“高位对应高位,低位对应低位”,0x30313233中的33因为是个位,是低位,所以对应内存单元的最低位,同理30在内存单元的最高位,由此推出0x30313233在数组中的排列顺序为:

  +--+--+--+--+--

  |33 32 31 30|

  +--+--+--+--+--

  ^

  input

  结果显而易见了,这个函数的功能只是将一个无符号整形数组转换成为了一个无符号字符形数组,作者的目的我虽然不清楚,但是这个地方确实可以优化如下:

output=(unsigned char *)input;把这个地方叫作算法的优化可能有点牵强,但是算法的优化确实是最为重要的,比如说搜索算法,如果选择不当,可能要丧失很多的效率。

  二、内存拷贝优化

  再观察一下MD5C里面的一段代码:static void MD5_memcpy (unsigned char *output, unsigned int *input, unsigned int len)
{
 unsigned int i;
 for (i = 0; i < len; i++)
  output[i] = input[i];
}
这处的为什么要修改是非常明显的,for循环是非常慢的,我们一般可以把类似的代码替换成为C的库函数或者操作系统的标准函数,如:CopyMemory ()
memcpy()
这种内存代码你也千万不要尝试自己去实现,那将是一种灾难,在每个操作系统中,内存拷贝可以说是非常频繁的,所以系统的内存拷贝函数基本上都是非常完美的,不信的话你可以自己写一段内存拷贝函数,然后和系统的内存拷贝函数比较一下就知道了,具体原代码可以参考linux中string.lib的实现。

  这处代码是特别值得注意的地方,如果你在你的代码的运算密集处写出了类似MD5_memcpy的代码的化,那么性能将会急剧的下降,对你的系统将是灾难性的。

作者:crazyd    责编:豆豆技术应用

正在加载评论...