Cevap vererek çok kalabalık bir partiye katılıyorum, ancak mevcut cevapların hiçbirinin hitap etmediği önemli bir düşünce var. Değeri json_encode()
ve serialize()
her ikisi de dizideki öğelerin sırasına bağlıdır!
Dizileri aynı değerlere sahip ancak farklı bir sırayla eklenen iki dizide sıralamanın ve sıralamanın sonuçları aşağıda verilmiştir (yazının altındaki kod) :
serialize()
1c4f1064ab79e4722f41ab5a8141b210
1ad0f2c7e690c8e3cd5c34f7c9b8573a
json_encode()
db7178ba34f9271bfca3a05c5dddf502
c9661c0852c2bd0e26ef7951b4ca9e6f
Sorted serialize()
1c4f1064ab79e4722f41ab5a8141b210
1c4f1064ab79e4722f41ab5a8141b210
Sorted json_encode()
db7178ba34f9271bfca3a05c5dddf502
db7178ba34f9271bfca3a05c5dddf502
Bu nedenle, bir diziye hashing uygulamak için önereceğim iki yöntem şöyle olacaktır:
// 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)) );
Seçimi json_encode()
veya serialize()
gerektiği verilerin türüne yapılan testler sonucu tespit Eğer kullandığınız . Tamamen metinsel ve sayısal veriler üzerinde kendi testlerime göre, eğer kod binlerce kez sıkı bir döngüde çalışmıyorsa, o zaman aradaki fark kıyaslamaya bile değmez. Ben şahsen json_encode()
bu tür veriler için kullanıyorum.
Yukarıdaki sıralama testini oluşturmak için kullanılan kod:
$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";
Benim hızlı deep_ksort () uygulamam bu duruma uyuyor, ancak kendi projelerinizde kullanmadan önce kontrol edin:
/*
* 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;
}