ARTICLE AD BOX
I'm building a caching layer in a PHP application where cache keys must be generated from input parameters. The parameters can be nested arrays or objects, and I need a deterministic cache key that uniquely represents the data.
For example, these two arrays should produce the same cache key:
$a = [ "user" => 10, "filters" => ["active" => true, "role" => "admin"] ]; $b = [ "filters" => ["role" => "admin", "active" => true], "user" => 10 ];The order of associative keys should not affect the cache key.
My first idea was something like this:
$key = md5(json_encode($data));But this fails because:
Associative array order changes the JSON string.
Objects may contain private/protected properties.
Floating point precision may cause inconsistencies.
json_encode might serialize values differently depending on encoding flags.
Another approach I tried was recursively sorting the array before hashing:
function normalize($data) { if (is_array($data)) { ksort($data); foreach ($data as &$v) { $v = normalize($v); } } return $data; } $key = md5(json_encode(normalize($data)));This works for arrays, but becomes messy when:
objects are included
objects implement JsonSerializable
objects contain circular references
My requirements:
deterministic result for same logical data
associative array order ignored
works with arrays + objects
avoids collisions as much as possible
reasonably fast (used in caching layer)
What would be the best practice in PHP to generate a stable hash/key for complex data structures?
Is there a known approach or library for this problem?
