Tôi đang tham gia một bữa tiệc rất đông người bằng cách trả lời, nhưng có một điều quan trọng mà không có câu trả lời hiện tại nào giải quyết. Giá trị của json_encode()
và serialize()
cả hai phụ thuộc vào thứ tự của các phần tử trong mảng!
Dưới đây là kết quả của việc không sắp xếp và sắp xếp các mảng, trên hai mảng có các giá trị giống nhau nhưng được thêm vào theo một thứ tự khác nhau (mã ở cuối bài đăng) :
serialize()
1c4f1064ab79e4722f41ab5a8141b210
1ad0f2c7e690c8e3cd5c34f7c9b8573a
json_encode()
db7178ba34f9271bfca3a05c5dddf502
c9661c0852c2bd0e26ef7951b4ca9e6f
Sorted serialize()
1c4f1064ab79e4722f41ab5a8141b210
1c4f1064ab79e4722f41ab5a8141b210
Sorted json_encode()
db7178ba34f9271bfca3a05c5dddf502
db7178ba34f9271bfca3a05c5dddf502
Do đó, hai phương pháp mà tôi muốn giới thiệu để băm một mảng sẽ là:
// 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)) );
Sự lựa chọn json_encode()
hoặc serialize()
nên được xác định bằng cách thử nghiệm loại dữ liệu mà bạn đang sử dụng . Bằng thử nghiệm của riêng tôi trên dữ liệu số và văn bản thuần túy, nếu mã không chạy một vòng lặp chặt chẽ hàng nghìn lần thì sự khác biệt thậm chí không đáng để làm điểm chuẩn. Cá nhân tôi sử dụng json_encode()
cho loại dữ liệu đó.
Đây là mã được sử dụng để tạo kiểm tra sắp xếp ở trên:
$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";
Triển khai deep_ksort () nhanh chóng của tôi, phù hợp với trường hợp này nhưng hãy kiểm tra nó trước khi sử dụng cho các dự án của riêng bạn:
/*
* 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;
}