【问题标题】:what is the highest performance hashing algo available in php when security is NOT at stake?当安全性不受影响时,php 中可用的最高性能哈希算法是什么?
【发布时间】:2011-10-02 03:38:24
【问题描述】:

我们在代码的许多部分都使用 md5 作为哈希算法。

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

碰撞是个问题。虽然不太可能,但它会导致一些重大问题。

有人想推荐一些在 cpu 上更轻的东西吗?

谢谢。


我们刚刚对 md5 与 crc32 进行了一些测试。

使用以下 sn-p:

<?
$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。

【问题讨论】:

    标签: php performance md5 hash


    【解决方案1】:

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

    不过,它的空间也比 MD5 小很多。取舍好吗? CRC32 通常只用于基本的错误检测/框架...(它实际上是一个“校验和”,而不是用于实际对话目的的“散列”函数。)

    编码愉快。


    您的数字也只显示减少了 2/3 ;-) 无论如何,我怀疑这 不是 主要瓶颈,并且强烈建议使用可行的算法 - 无论是 MD5或 SHA1 或其他。 MD5 在计算上只比 SHA1 稍微便宜(它在一个数量级之内),但实现可能是一个因素。如果需要,也可以对此进行基准测试...

    【讨论】:

    • 我们选择了 crc32。我们进行了大量的错误记录,因此任何冲突都会很快出现。感谢您的详细回复。
    【解决方案2】:

    php 在线用户指南中的一个 cmets 表明 md4 是最快的。然后是md5,然后是crc32,然后是sha1。

    我自己的测试验证了这一点。很奇怪,您的测试应该以其他方式显示。我也尝试了你的 sn-p 并得到了相反的结果。可能与机器或 PHP 版本有关。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 'variable name' 对我们不起作用,因为我所说的这个 md5'ing 是我们拥有的自定义查询缓存处理程序。就目前而言,我们将查询存储为 'query_'.md5($query)... 在 20 秒内检查原始问题,因为我刚刚对 crc32 进行了一些测试。我们希望继续使用某种基于哈希的系统,因为大部分代码都是围绕此类构建的。
      猜你喜欢
      • 1970-01-01
      • 2011-05-16
      • 2012-01-25
      • 2016-10-22
      • 2010-11-10
      • 2011-06-26
      • 2010-09-16
      • 2015-09-09
      • 2010-09-22
      相关资源
      最近更新 更多