php Перевод массива в строку (рекурсивно) -- как хэш функция, какие есть варианты. Производительность
Primary tabs
Существует как минимум 4-ре базовые функции, которые можно использовать для "распечатки"
массива, наиболее быстрой и рекомендуемой на момент написания данного теста является json_encode() (а её уже можно обернуть в хэширующую функцию на для строки), т.е. так:
return md5(json_encode($array));
если требуется массив можно предварительно сортировать, чтобы получать один ключ для одинаковых значений в разном порядке:
array_multisort($array); // (по ссылке) рекурсивно сортирует массив return md5(json_encode($array));
Производительность
Сравнение производительности (можете скопировать этот код и запустить его):
<?php // десериализуем многомерный массив $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:{}}}}}}}}}'); $iterationCount = 10000; $results = []; //serialize $start = microtime(1); for ($i=0;$i<$iterationCount;$i++) { $serial = md5(serialize($array)); } $results['serilize'] = microtime(1)- $start; //json_encode $start = microtime(1); for ($i=0;$i<$iterationCount;$i++) { $serial = md5(json_encode($array)); } $results['json_encode'] = microtime(1)- $start; // print_r $start = microtime(1); for ($i=0;$i<$iterationCount;$i++) { $serial = md5(print_r($array, true)); } $results['print_r'] = microtime(1)- $start; // var_export $start = microtime(1); for ($i=0;$i<$iterationCount;$i++) { $serial = md5(var_export($array, true)); } $results['var_export'] = microtime(1)- $start; print_r($results);
Сделано на базе идеи: https://stackoverflow.com/a/7723730
- Log in to post comments
- 1677 reads