hash()为什么比md5()要快?(已过时)
上篇文章中我们说了 hash要比md5快很多 为什么呢?
我就去看了下PHP的源码..
给我安慰的是 它们用的算法是一样的..这个不用想就知道..md5的算法就是那样..
但是为什么会出现这么大的速度诧异呢?
顺便提一下 这两个算法实现的代码我就不贴了 分别是\ext\hash\hash_md.c与\ext\standard\md5.c
想看的可以自己下载份PHP的源码比较下.
接上面.为什么速度会这么大呢?
我仔细比对了一下..发现代码几乎一致..令我十分郁闷..
再仔细看看 有个诧异..
hash中
1 2 3 4 5 6 | if (raw_output) { RETURN_STRINGL(digest, 16, 1); } else { make_digest(md5str, digest); RETVAL_STRING(md5str, 1); } |
md5中
1 2 3 4 5 6 | if (raw_output) { RETURN_STRINGL(digest, 16, 1); } else { make_digest_ex(md5str, digest, 16); RETVAL_STRING(md5str, 1); } |
我们发现 一个使用的是make_digest而另外一个是make_digest_ex
我们去看make_digest的代码 往上看 看到hash中的make_digest调用的是php_hash_bin2hex
而md5中的make_digest_ex没有任何调用 就是一个函数..
我现在把这两个函数写出来
这个是md5的
1 2 3 4 5 6 7 8 9 10 11 | PHPAPI void make_digest_ex(char *md5str, unsigned char *digest, int len) { static const char hexits[17] = "0123456789abcdef"; int i; for (i = 0; i < len; i++) { md5str[i * 2] = hexits[digest[i] >> 4]; md5str[(i * 2) + 1] = hexits[digest[i] & 0x0F]; } md5str[len * 2] = '\0'; } |
下面这个是hash调用的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | PHP_HASH_API void make_digest(char *md5str, unsigned char *digest) { php_hash_bin2hex(md5str, digest, 16); md5str[32] = '\0'; } static inline void php_hash_bin2hex(char *out, const unsigned char *in, int in_len) { static const char hexits[17] = "0123456789abcdef"; int i; for(i = 0; i < in_len; i++) { out[i * 2] = hexits[in[i] >> 4]; out[(i * 2) + 1] = hexits[in[i] & 0x0F]; } } |
看到什么区别了吗?在md5中函数的申明是PHPAPI
我们到php.h中查找这个宏的定义是
1 2 3 4 5 | # ifdef PHP_EXPORTS # define PHPAPI __declspec(dllexport) # else # define PHPAPI __declspec(dllimport) # endif |
我们看到PHP把这个函数到处到dll中了..所以调用的时候会慢一点
而hash中 直接将php_hash_bin2hex声明的是static inline.. inline的效率与dll的效率可想而知.
为了验证我的猜想 晚上回家换linux编译下试试:) 未完待续..
————————————我是杯具分割线—————————————-
刚才没事儿就去linux下编译了自己的一份测试了下..结果让我倒塌.
先不说结果.. 先自我批评 自我忏悔..
我上个帖子中的测试结果 并没有自己实际的去测试.而是在手册中 看到这样的评论.就直接拿出来.并没有证明其正确性.
我现在用相同的代码测试结果是:
0.24335312843323: hash/md5
0.17165088653564: md5
0.26487493515015: hash/sha1
0.19068503379822: sha1
————————
0.26703000068665: hash/md5
0.20045804977417: md5
0.29354310035706: hash/sha1
0.21823596954346: sha1
我们看到 hash要比md5慢 跟上次我贴的结果完全相反..
害我折腾去重新编译验证..结果发现验证的结果是相反的..
我回头再看那个人的评论 发现那个人是2007年评论的.而且他并没有留下他的PHP版本.
所以我猜想.PHP在一些版本中 确实存在这个问题..但是现在..我们后来使用的版本.已经修正了这个问题.
但是源码中.为什么函数不是inline反而那么快呢?
读通代码后.发现这个函数没起到什么影响MD5算法的关键..这个函数只是把MD5计算后的2进制改变为16进制.
也就是说 在这个函数执行之前..PHP已经将字符串进行MD5加密完成了..
所以不会起到什么关键性的速度提升..
无论如何..这次太唐突了..
阿米托佛
6 Comments to “ hash()为什么比md5()要快?(已过时) ”
Post comment
分类目录
- ActionScript (2)
- CSS (25)
- Java (3)
- JavaScript (41)
- PHP (105)
- 心情杂谈 (34)
- 收集整理 (77)
- 本站原创 (55)
最近文章
- 将google ssl设置为IE8的默认搜索引擎..
- 我们来做一个会呼吸的菜单吧!!
- 在编译php-fpm0.6的时候需要注意的一些问题
- 使用PHP将大文件导入到数据库中..
- 关于用PHP调用WebService中参数为complexType的问题
- 神奇的两次按位非运算符
- 百路推免费短网址服务..首创”收藏夹获取短网址”..
- 哥学社正式上线..
- jQuery中getJSON跨域原理详解
- Web辅助工具条(原名:河蟹工具条CrabBar)0.1发布
- 腾讯微博PC端发图教程
- goo.gl URL Shortener for WordPress
- PHP上传进度条深度解析
- Google短网址(goo.gl)服务类
- TinyURL.class.php
最近评论
- 匿名 在 一个PHP+AJAX留言板的完整例子.非常简单! 上的评论
- pfeng 在 将google ssl设置为IE8的默认搜索引擎.. 上的评论
- pfeng 在 将google ssl设置为IE8的默认搜索引擎.. 上的评论
- 北戴河旅游住宿 在 PHPer的历练 上的评论
- konakona 在 将google ssl设置为IE8的默认搜索引擎.. 上的评论
- 宁静致远 在 PHPer的历练 上的评论
- Corsair_Boss 在 强人作品 – jQuery1.2.6源码分析 上的评论
- fanglor 在 PHPer的历练 上的评论
- fanglor 在 百路推免费短网址服务..首创”收藏夹获取短网址”.. 上的评论
- 匿名 在 Web辅助工具条(原名:河蟹工具条CrabBar)0.1发布 上的评论
文章索引模板
- 2010年七月 (3)
- 2010年六月 (4)
- 2010年五月 (2)
- 2010年四月 (9)
- 2010年三月 (12)
- 2010年二月 (1)
- 2010年一月 (3)
- 2009年十二月 (2)
- 2009年十一月 (3)
- 2009年十月 (3)
- 2009年九月 (5)
- 2009年八月 (4)
- 2009年七月 (6)
- 2009年六月 (8)
- 2009年五月 (8)
- 2009年四月 (16)
- 2009年三月 (19)
- 2009年二月 (22)
- 2009年一月 (20)
- 2008年十二月 (38)
- 2008年十一月 (22)
- 2008年十月 (7)
- 2008年九月 (3)
- 2008年八月 (24)

Jessica

研究的真细~~看来平时工作不忙么,要给你加点任务了。
哈哈.. 抽空抽空..
发现这个函数没起到什么影响MD5算法的关键.
应该是这样的
今天看了上一篇文章后我在我的机子上测了一下,发现hash要快一些,难道我因为文章的先入为主影响看错了?
我的环境是centos5.4+apache2.x+php5.3
看样明天回去我要再看看。
额。。还没到能看得懂的程度,
不过博主怎么能不说一声就将俺的友链给去了呢?太伤心了~~
啊…这不是刚换了wp 好多链接还没有加上 这就给你加上 嘿嘿