生成多维数组的 MD5(或任何其他哈希)的最佳方法是什么?
我可以轻松编写一个循环,遍历数组的每一层,将每个值连接成一个字符串,然后简单地对字符串执行 MD5。
但是,这似乎很麻烦,我想知道是否有一个时髦的函数可以接受一个多维数组,并对其进行哈希处理。
最佳答案
(底部可复制粘贴功能)
如前所述,以下将起作用。
md5(serialize($array));
然而,值得注意的是(讽刺地)json_encode 的执行速度明显更快:
md5(json_encode($array));
事实上,这里的速度提高了两倍,因为 (1) json_encode 单独执行比序列化更快,并且 (2) json_encode 生成的字符串更小,因此 md5 处理的更少。
编辑:以下是支持这一说法的证据:
<?php //this is the array I'm using -- it's multidimensional.
$array = unserialize('a:6:{i:0;a:0:{}i:1;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}i:5;a:5:{i:0;a:0:{}i:1;a:4:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}i:3;a:6:{i:0;a:0:{}i:1;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}i:5;a:5:{i:0;a:0:{}i:1;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}}}');
//The serialize test
$b4_s = microtime(1);
for ($i=0;$i<10000;$i++) {
$serial = md5(serialize($array));
}
echo 'serialize() w/ md5() took: '.($sTime = microtime(1)-$b4_s).' sec<br/>';
//The json test
$b4_j = microtime(1);
for ($i=0;$i<10000;$i++) {
$serial = md5(json_encode($array));
}
echo 'json_encode() w/ md5() took: '.($jTime = microtime(1)-$b4_j).' sec<br/><br/>';
echo 'json_encode is <strong>'.( round(($sTime/$jTime)*100,1) ).'%</strong> faster with a difference of <strong>'.($sTime-$jTime).' seconds</strong>';
JSON_ENCODE 的速度始终超过 250% (2.5x)(通常超过 300%)——这不是一个微不足道的差异。您可以在此处查看使用此实时脚本的测试结果:
- http://nathanbrauer.com/playground/serialize-vs-json.php
- http://nathanbrauer.com/playground/plain-text/serialize-vs-json.php
现在,需要注意的一点是,array(1,2,3) 会产生一个与 array(3,2,1) 不同的 MD5。 如果这不是你想要的。试试下面的代码:
//Optionally make a copy of the array (if you want to preserve the original order)
$original = $array;
array_multisort($array);
$hash = md5(json_encode($array));
编辑:关于颠倒顺序是否会产生相同的结果存在一些问题。所以,我在这里做到了(正确):
- http://nathanbrauer.com/playground/json-vs-serialize.php
- http://nathanbrauer.com/playground/plain-text/json-vs-serialize.php
如您所见,结果完全相同。这是(更正)测试originally created by someone related to Drupal :
- http://nathanjbrauer.com/playground/drupal-calculation.php
- http://nathanjbrauer.com/playground/plain-text/drupal-calculation.php
为了更好的衡量,这里有一个可以复制和粘贴的函数/方法(在 5.3.3-1ubuntu9.5 中测试):
function array_md5(Array $array) {
//since we're inside a function (which uses a copied array, not
//a referenced array), you shouldn't need to copy the array
array_multisort($array);
return md5(json_encode($array));
}
关于PHP最好的MD5多维数组方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2254220/