在不考虑安全性的情况下,php中可用的最高性能哈希算法是什么?


what is the highest performance hashing algo available in php when security is NOT at stake?

我们在代码的许多部分使用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。

要打败CRC32或它的变体是非常困难的(实际上几乎不可能),因为它是如此微不足道(在单个32位单词上滚动异或)。此外,由于crc32欺骗并跳转到本机代码,除非其他解决方案也这样做,否则本机CRC32实现很可能不会被击败。

然而,它也有一个比MD5小得多的空间。这种权衡可以吗?CRC32通常只用于基本的错误检测/帧…(它实际上是一个"校验和"函数,而不是用于实际会话目的的"哈希"函数。)

幸福的编码。


你的数字也只显示了2/3的减少;-)在任何情况下,我怀疑这个不是的主要瓶颈,并强烈建议使用一个算法,将工作-无论是MD5或SHA1或其他。MD5在计算上只比SHA1稍微便宜一点(在一个数量级内),但是实现可能起了一定的作用。如果需要,也可以运行基准测试…

php online userguide中的一个评论显示md4是最快的。md5,然后是crc32,最后是sha1。

我自己的测试证实了这一点。很奇怪,你的测试结果却不是这样。我也试过你的片段,得到了相反的结果。可能是机器或PHP版本相关。

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

如果你想减少CPU的开销,你可以直接使用变量名作为散列。如果要将字符串转换为int型,只需将其作为基数256并将其转换为int型即可。

也许你可以尝试sha,它为任何输入生成一个40个字符的长字符串。