136 votes

PHP meilleur moyen de MD5 tableau multidimensionnel?

Je me demandais quel est le meilleur moyen de générer un MD5 (ou tout autre hachage) d'un tableau multidimensionnel?

Je pourrais facilement écrire une boucle qui traverserait chaque niveau du tableau, en concaténant chaque valeur dans une chaîne et en effectuant simplement le MD5 sur la chaîne.

Cependant, cela semble au mieux encombrant et je me suis demandé s'il y avait une fonction géniale qui prendrait un tableau multi-dimensionnel, et le hachait?

Merci pour votre temps.

293voto

Nathan J. Brauer Points 4316

(Copier-n-coller-mesure de la fonction en bas)

Comme mentionné avant, le travail.

md5(serialize($array));

Cependant, il est intéressant de noter que (ironiquement) json_encode effectue sensiblement plus rapide:

md5(json_encode($array));

En fait, l'augmentation de la vitesse est deux fois ici (1) json_encode seul effectue plus rapidement que sérialiser, et (2) json_encode produit une chaîne de plus petite et donc moins de md5 pour gérer.

Edit: Voici des éléments de preuve à l'appui de cette demande:

<?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 est constamment supérieure à 250% (2,5 x plus rapide (souvent de plus de 300%) -- ce n'est pas une mince différence. Vous pouvez voir les résultats de l'essai avec ce script ici:

Maintenant, une chose à noter est array(1,2,3) va produire une autre MD5 array(3,2,1). Si ce n'est PAS ce que vous voulez. Essayez le code suivant:

//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));

Et pour faire bonne mesure, voici une fonction/méthode, vous pouvez copier et coller (testé dans 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));
}

169voto

Brock Batsell Points 3505
md5(serialize($array));

7voto

Chris Jester-Young Points 102876

Mis à part l'excellente réponse de Brock (+1), toute bibliothèque de hachage décente vous permet de mettre à jour le hachage par incréments. Vous devriez donc pouvoir mettre à jour chaque chaîne séquentiellement, au lieu de devoir créer une chaîne géante.

Voir: hash_update

4voto

Max Wheeler Points 31
 md5(serialize($array));
 

Cela fonctionnera, mais le hachage changera en fonction de l'ordre du tableau (cela n'a pas d'importance cependant).

3voto

Willem-Jan Points 21

Notez que serialize et json_encode agissent différemment lorsqu'il s'agit de tableaux numériques où les clés ne commencent pas à 0 ou de tableaux associatifs. json_encode stockera ces tableaux sous forme de Object , donc json_decode renvoie un Object , où unserialize renverra un tableau avec exactement les mêmes clés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X