Как я могу безопасно генерировать детерминированные ключи кэша для сложных массивов PHP (включая объекты) без риска коллPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как я могу безопасно генерировать детерминированные ключи кэша для сложных массивов PHP (включая объекты) без риска колл

Сообщение Anonymous »

Я создаю уровень кэширования в приложении PHP, где ключи кэша должны генерироваться на основе входных параметров. Параметры могут быть вложенными массивами или объектами, и мне нужен детерминированный ключ кэша, который уникальным образом представляет данные.
Например, эти два массива должны создавать один и тот же ключ кэша:

Код: Выделить всё

$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
  • объекты содержат циклические ссылки
Мой требования:
  • детерминированный результат для одних и тех же логических данных
  • порядок ассоциативных массивов игнорируется
  • работает с массивами + объектами
  • максимально избегает коллизий
  • достаточно быстро (используется) на уровне кэширования)
Каков будет лучший метод PHP для создания стабильного хэша/ключа для сложных структур данных?
Существует ли известный подход или библиотека для решения этой проблемы?

Подробнее здесь: https://stackoverflow.com/questions/799 ... rays-inclu
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»