PHP中MD5函数效率
本文最后更新于 5985 天前,其中的信息可能已经有所发展或是发生改变。

起因
在校内APP发开论坛看到:
姓名大作战由于每次战斗都需要经过2次md5计算,访问用户一多就经常把服务器cpu占用搞到100%,空间商找我麻烦了,昨晚把所在虚拟目录封闭了已经。现在临时采用了将计算过的用户的md5存到数据库中的方法,但是这样基本每次战斗还是会经过一次的md5计算(因为所选择的对手基本都应该是没有对战过的,之前没有计算过他的md5值),谁能提供点更好的方法。

md5函数与字符串长度
然后就对PHP下的md5系列函数进行了研究,发现在网上的一些信息其实是有细节问题的。比如“中md5()函数的执行时间会随着字符串的长度增加而直线变慢”。虽然这个结论大致是正确的,但是他演示程序还是有细节问题,因为其中有不少的时间是被随机字符串给占用了。

经过我的测试,PHP中md5函数确实会随着被加密字符串长度的增加而函数时间正比增加,在PHP的实际应用中,对小于100位的md5加密不用担心其效率和性能。

hash('md5', 'xxx')与md5('xxx')
如果是PHP的话,在所需加密的字符串位数较少时,hash('md5', 'xxx')会比md5('xxx')效率高上2-8倍左右。当位数增加的时候,比如500位以上时,hash('md5', 'xxx')与md5('xxx')时间基本相差无几,可以放心使用。

测试代码
Test_hash.php


$t1 = gettimeofday();

for ($i = 0; $i < 10000; $i++){
    $x = hash('md5', 'PHP中MD5效率的白话,网址https://kimi.pub/331.html');
}

$t2 = gettimeofday();

echo ($t2['sec'] - $t1['sec']) * 1000 + ($t2['usec'] - $t1['usec']) / 1000 . "\n";

Test_md5.php


$t1 = gettimeofday();

for ($i = 0; $i < 10000; $i++){
    $x = md5('PHP中MD5效率的白话,网址https://kimi.pub/331.html');
}

$t2 = gettimeofday();

echo ($t2['sec'] - $t1['sec']) * 1000 + ($t2['usec'] - $t1['usec']) / 1000 . "\n";

结论
1.md5函数执行时间会随着字符串的长度增加而直线变慢。
2.在位数较小的情况下,hash('md5', 'xxx')与md5('xxx')效率高,但是此时单次md5操作所需时间很微小,可以忽略不计,使用md5函数。
3.当位数较多的情况下,比如500位以上时,hash('md5', 'xxx')与md5('xxx')时间基本相差无几,可以放心使用md5函数。
4.总的来说,直接使用md5('xxx')忽略hash('md5', 'xxx')是可取的。

PS:本文真无聊。

评论

  1. 16 年前
    2008-8-02 21:25:49

    说实话,本文不算太无聊

  2. little
    16 年前
    2008-8-02 22:51:51

    挺好啊,咋无聊了。

  3. 习明
    16 年前
    2008-8-03 14:43:14

    他没有发现新大陆 所以觉得无聊 常规的效率测试而已 咔咔

  4. 16 年前
    2008-8-06 1:07:39

    厉害

  5. lulu
    16 年前
    2008-8-10 0:09:51

    哈哈
    当时说是md5导致服务器挂的时候
    我也想测试测试
    哈哈
    看来想法一样呢

  6. 16 年前
    2008-8-15 18:11:40

    PS:本文对我很有用

  7. ashuai
    16 年前
    2008-8-20 12:53:40

    何不ajax用客戶端js算md5再回傳~
    反正是遊戲,又不會有安全性問題。

  8. lvan
    16 年前
    2008-8-20 15:51:27

    我这里测试的结果是
    <?php
    $t1 = gettimeofday();

    for ($i = 0; $i < 10000; $i++){
    $x = hash(‘md5’, ‘PHP中MD5效率的白话,网址http://www.ccvita.com/331.html’);
    }

    $t2 = gettimeofday();

    echo ($t2[‘sec’] – $t1[‘sec’]) * 1000 + ($t2[‘usec’] – $t1[‘usec’]) / 1000 . “\n”;
    echo “”;

    $t3 = gettimeofday();

    for ($i = 0; $i

    23.204
    18.377

    md5比hash快很多….

  9. 博主
    16 年前
    2008-8-21 1:10:54

    不要放在一起测试的说,你贴的代码不完全,大都每个文件测试可能会更准确些,虽然统计的时候麻烦。

  10. 16 年前
    2008-8-24 17:52:09

    恩,经过我翻看
    PHP5.2-SRC/hash/hash_md.c
    和PHP5.2-SRC/ext/standard/basic_function.c
    得出,hash的md5和直接md5在算法实现上是一样的。

  11. 华晨
    16 年前
    2008-12-23 16:10:35

    md5加密不保险的,最好自己设计散列加密算法。

  12. 14 年前
    2010-8-15 23:05:04

    都比较慢,可以自己实现一个满足需求的算法

  13. 14 年前
    2011-6-21 15:28:26

    很不错的教程,我测试了一下,没有问题,例子
    http://www.glyjw.com

  14. meepo
    13 年前
    2011-11-15 14:39:12

    同意ashuai
    虽然讨论的是php 的md5效率,
    但是像这种情况,js实现md5可以代替呀

  15. 丰情
    11 年前
    2013-7-18 10:35:29

    学习了

  16. MH
    11 年前
    2013-9-04 12:05:07

    >> 如果是PHP的话,在所需加密的字符串位数较少时,hash(‘md5’, ‘xxx’)会比md5(‘xxx’)效率高上2-8倍左右。

    未必如此。硬件,操作系统,版本都会造成影响,使得结果相反。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇