当安全性不受威胁时,php中可用的最高性能哈希算法是什么?

时间:2011-07-10 06:43:58

标签: php performance md5 hash

我们在代码的许多部分使用md5作为散列算法。

在这种情况下的安全性不是问题。我们只使用md5作为生成唯一标识符的方法,以便在apc等中存储各种项目。

碰撞是一个问题。虽然不太可能,但这会引起一些重大问题。

有人想在cpu上建议更轻松的东西吗?

感谢。


我们刚刚用md5和crc32进行了一些测试。

使用以下代码段:

<?
$start=microtime(true);
for($i=1;$i<=1000000;$i++){
    md5(rand(10000000,99999999)); <--- crc32 tested here too.
}
$end=microtime(true);
echo $end-$start."\n";
?>

结果如下:

MD5:

1.4991459846497
1.7893800735474
1.4672470092773

CRC32:

0.97880411148071
0.94331979751587
0.93316197395325

因此看起来crc32比使用md5快1/3。

3 个答案:

答案 0 :(得分:8)

非常非常很难(几乎不可能,真的)击败CRC32或变体因为它是如此微不足道(在单个32位字上滚动XOR)。此外,由于crc32作弊并跳转到本机代码,除非另一个解决方案也这样做,否则本机CRC32实现的可能性不会被打败。

但是,它还具有小于MD5的空间。权衡是否还可以? CRC32通常仅用于基本的错误检测/成帧...(它实际上是一个“校验和”,而不是用于实际会话目的的“散列”功能。)

快乐的编码。


此外,您的数字仅显示2/3减少;-)无论如何,我怀疑不是的主要瓶颈,并强烈建议使用可行的算法 - 无论是MD5或SHA1或其他。 MD5的计算成本仅略低于SHA1 (它在一个数量级内),但实现可能是一个因素。如果需要,也可以对此运行基准测试...

答案 1 :(得分:1)

php在线用户指南中的一条评论显示 md4是最快的。然后是md5,接着是crc32,接着是sha1。

我自己的测试验证了这一点。非常奇怪,你的测试应该显示出来。我也尝试了你的片段并得到了相反的结果。也许它依赖于机器或PHP版本。

http://php.net/manual/en/function.hash-algos.php

答案 2 :(得分:0)

好吧,如果你想点亮CPU,你可以使用变量名作为哈希。如果要将字符串转换为int,只需将其视为基数256并将其转换为int。

也许你可以尝试使用sha生成一个40字符长的字符串用于任何输入。