В настоящее время наиболее одобренный ответ md5(serialize($array));
плохо работает с объектами.
Рассмотрим код:
$a = array(new \stdClass());
$b = array(new \stdClass());
Даже если массивы разные (они содержат разные объекты), они имеют одинаковый хэш при использовании md5(serialize($array));
. Так что твой хэш бесполезен!
Чтобы избежать этой проблемы, вы можете заменить объекты с результатом spl_object_hash()
перед сериализацией. Вы также должны делать это рекурсивно, если ваш массив имеет несколько уровней.
Код ниже также сортирует массивы по ключам, как предположил dotancohen.
function replaceObjectsWithHashes(array $array)
{
foreach ($array as &$value) {
if (is_array($value)) {
$value = $this->replaceObjectsInArrayWithHashes($value);
} elseif (is_object($value)) {
$value = spl_object_hash($value);
}
}
ksort($array);
return $array;
}
Теперь вы можете использовать md5(serialize(replaceObjectsWithHashes($array)))
.
(Обратите внимание, что массив в PHP имеет тип значения. Поэтому функция replaceObjectsWithHashes
НЕ меняет исходный массив.)