28 lines
680 B
Python
28 lines
680 B
Python
from __future__ import annotations
|
|
|
|
import hashlib
|
|
import json
|
|
from typing import Any
|
|
|
|
|
|
def build_risk_manifest_fingerprint(manifests: list[dict[str, Any]]) -> str:
|
|
ordered_manifests = sorted(
|
|
manifests,
|
|
key=lambda manifest: json.dumps(
|
|
manifest,
|
|
ensure_ascii=False,
|
|
sort_keys=True,
|
|
separators=(",", ":"),
|
|
default=str,
|
|
),
|
|
)
|
|
normalized = json.dumps(
|
|
ordered_manifests,
|
|
ensure_ascii=False,
|
|
sort_keys=True,
|
|
separators=(",", ":"),
|
|
default=str,
|
|
)
|
|
digest = hashlib.sha256(normalized.encode("utf-8")).hexdigest()
|
|
return f"sha256:{digest}"
|