using System.Security.Cryptography; using System.Text; namespace StellaOps.Findings.Ledger.Domain; public static class LedgerChainIdGenerator { public static Guid FromTenantPolicy(string tenantId, string policyVersion) { return FromTenantSubject(tenantId, policyVersion); } public static Guid FromTenantSubject(string tenantId, string subject) { ArgumentException.ThrowIfNullOrWhiteSpace(tenantId); ArgumentException.ThrowIfNullOrWhiteSpace(subject); var normalized = $"{tenantId.Trim()}::{subject.Trim()}"; var bytes = Encoding.UTF8.GetBytes(normalized); Span guidBytes = stackalloc byte[16]; var hash = SHA256.HashData(bytes); hash.AsSpan(0, 16).CopyTo(guidBytes); return new Guid(guidBytes); } }