$items */ public function computeIdentity(array $items): string { if ($items === []) { return hash('sha256', '[]'); } $normalized = array_map( fn (array $item): string => implode('|', [ trim((string) ($item['subject_type'] ?? '')), trim((string) ($item['subject_external_id'] ?? '')), trim((string) ($item['policy_type'] ?? '')), trim((string) ($item['baseline_hash'] ?? '')), ]), $items, ); sort($normalized, SORT_STRING); return hash('sha256', implode("\n", $normalized)); } /** * Compute a stable content hash for a single inventory item's metadata. * * Strips volatile OData keys and normalizes for stable comparison. */ public function hashItemContent(mixed $metaJsonb): string { return $this->hasher->hashNormalized($metaJsonb); } }