38 lines
923 B
Python
38 lines
923 B
Python
from __future__ import annotations
|
|
|
|
import hashlib
|
|
import json
|
|
from typing import Any
|
|
|
|
_EXCLUDED_FROM_HASH = frozenset(
|
|
{
|
|
"version",
|
|
"content_hash",
|
|
"sync_timestamp",
|
|
"sync_status",
|
|
"created_at",
|
|
"updated_at",
|
|
"created_by",
|
|
"updated_by",
|
|
"client_id",
|
|
"server_synced",
|
|
"is_deleted",
|
|
"deleted_at",
|
|
"deleted_by",
|
|
"enterprise_id",
|
|
}
|
|
)
|
|
|
|
|
|
def stable_payload_for_hash(data: dict[str, Any]) -> dict[str, Any]:
|
|
return {k: v for k, v in data.items() if k not in _EXCLUDED_FROM_HASH}
|
|
|
|
|
|
def compute_content_hash_hex(payload: dict[str, Any]) -> str:
|
|
raw = json.dumps(payload, sort_keys=True, ensure_ascii=False, default=str).encode("utf-8")
|
|
return hashlib.sha256(raw).hexdigest()
|
|
|
|
|
|
def compute_content_hash(data: dict[str, Any]) -> str:
|
|
return compute_content_hash_hex(stable_payload_for_hash(data))
|