我们在代码的许多部分使用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。
答案 0 :(得分:8)
非常非常很难(几乎不可能,真的)击败CRC32或变体因为它是如此微不足道(在单个32位字上滚动XOR)。此外,由于crc32
作弊并跳转到本机代码,除非另一个解决方案也这样做,否则本机CRC32实现的可能性不会被打败。
但是,它还具有多小于MD5的空间。权衡是否还可以? CRC32通常仅用于基本的错误检测/成帧...(它实际上是一个“校验和”,而不是用于实际会话目的的“散列”功能。)
快乐的编码。
此外,您的数字仅显示2/3减少;-)无论如何,我怀疑不是的主要瓶颈,并强烈建议使用可行的算法 - 无论是MD5或SHA1或其他。 MD5的计算成本仅略低于SHA1 (它在一个数量级内),但实现可能是一个因素。如果需要,也可以对此运行基准测试...
答案 1 :(得分:1)
php在线用户指南中的一条评论显示 md4是最快的。然后是md5,接着是crc32,接着是sha1。
我自己的测试验证了这一点。非常奇怪,你的测试应该显示出来。我也尝试了你的片段并得到了相反的结果。也许它依赖于机器或PHP版本。
答案 2 :(得分:0)
好吧,如果你想点亮CPU,你可以使用变量名作为哈希。如果要将字符串转换为int,只需将其视为基数256并将其转换为int。
也许你可以尝试使用sha生成一个40字符长的字符串用于任何输入。