Например, эти два массива должны создавать один и тот же ключ кэша:
Код: Выделить всё
$a = [
"user" => 10,
"filters" => ["active" => true, "role" => "admin"]
];
$b = [
"filters" => ["role" => "admin", "active" => true],
"user" => 10
];
Моя первая идея была примерно такой:
Код: Выделить всё
$key = md5(json_encode($data));
- Порядок ассоциативного массива меняет строку JSON.
- Объекты могут содержать частные/защищенные свойства.
- Точность с плавающей запятой может привести к несогласованности.
- может сериализовать значения по-разному в зависимости от флагов кодировки.
Код: Выделить всё
json_encode
Код: Выделить всё
function normalize($data) {
if (is_array($data)) {
ksort($data);
foreach ($data as &$v) {
$v = normalize($v);
}
}
return $data;
}
$key = md5(json_encode(normalize($data)));
- объекты включены
- объекты реализуют JsonSerializable
- объекты содержат циклические ссылки
- детерминированный результат для одних и тех же логических данных
- порядок ассоциативных массивов игнорируется
- работает с массивами + объектами
- максимально избегает коллизий
- достаточно быстро (используется) на уровне кэширования)
Существует ли известный подход или библиотека для решения этой проблемы?
Подробнее здесь: https://stackoverflow.com/questions/799 ... rays-inclu
Мобильная версия