Ich schließe mich einer sehr überfüllten Gruppe an, indem ich antworte, aber es gibt eine wichtige Überlegung, die keine der vorhandenen Antworten anspricht. Der Wert von json_encode()
und serialize()
beide hängen von der Reihenfolge der Elemente im Array ab!
Hier sind die Ergebnisse , wenn die Arrays nicht sortiert und sortiert werden, sondern auf zwei Arrays mit identischen Werten, die jedoch in einer anderen Reihenfolge hinzugefügt wurden (Code am Ende des Beitrags) :
serialize()
1c4f1064ab79e4722f41ab5a8141b210
1ad0f2c7e690c8e3cd5c34f7c9b8573a
json_encode()
db7178ba34f9271bfca3a05c5dddf502
c9661c0852c2bd0e26ef7951b4ca9e6f
Sorted serialize()
1c4f1064ab79e4722f41ab5a8141b210
1c4f1064ab79e4722f41ab5a8141b210
Sorted json_encode()
db7178ba34f9271bfca3a05c5dddf502
db7178ba34f9271bfca3a05c5dddf502
Daher würden ich zwei Methoden empfehlen, um ein Array zu hashen:
// You will need to write your own deep_ksort(), or see
// my example below
md5( serialize(deep_ksort($array)) );
md5( json_encode(deep_ksort($array)) );
Die Auswahl json_encode()
oder serialize()
sollte durch Testen des von Ihnen verwendeten Datentyps festgelegt werden . Wenn der Code nach meinen eigenen Tests mit rein textuellen und numerischen Daten nicht tausendmal in einer engen Schleife ausgeführt wird, ist der Unterschied nicht einmal ein Benchmarking wert. Ich persönlich verwende json_encode()
für diese Art von Daten.
Hier ist der Code, der zum Generieren des obigen Sortiertests verwendet wird:
$a = array();
$a['aa'] = array( 'aaa'=>'AAA', 'bbb'=>'ooo', 'qqq'=>'fff',);
$a['bb'] = array( 'aaa'=>'BBBB', 'iii'=>'dd',);
$b = array();
$b['aa'] = array( 'aaa'=>'AAA', 'qqq'=>'fff', 'bbb'=>'ooo',);
$b['bb'] = array( 'iii'=>'dd', 'aaa'=>'BBBB',);
echo " serialize()\n";
echo md5(serialize($a))."\n";
echo md5(serialize($b))."\n";
echo "\n json_encode()\n";
echo md5(json_encode($a))."\n";
echo md5(json_encode($b))."\n";
$a = deep_ksort($a);
$b = deep_ksort($b);
echo "\n Sorted serialize()\n";
echo md5(serialize($a))."\n";
echo md5(serialize($b))."\n";
echo "\n Sorted json_encode()\n";
echo md5(json_encode($a))."\n";
echo md5(json_encode($b))."\n";
Meine schnelle Implementierung von deep_ksort () passt in diesen Fall, aber überprüfen Sie sie, bevor Sie sie für Ihre eigenen Projekte verwenden:
/*
* Sort an array by keys, and additionall sort its array values by keys
*
* Does not try to sort an object, but does iterate its properties to
* sort arrays in properties
*/
function deep_ksort($input)
{
if ( !is_object($input) && !is_array($input) ) {
return $input;
}
foreach ( $input as $k=>$v ) {
if ( is_object($v) || is_array($v) ) {
$input[$k] = deep_ksort($v);
}
}
if ( is_array($input) ) {
ksort($input);
}
// Do not sort objects
return $input;
}