def case_seed(global_seed: int, source_id: str) -> int: """Per-image deterministic seed derived from global seed and source path.""" h = hashlib.sha256(f"{global_seed}|{source_id}".encode()).hexdigest() return int(h[:8], 16) def generate_phi(seed: int) -> dict: fake = Faker() Faker.seed(seed) rng = random.Random(seed) last = fake.last_name() first = fake.first_name() middle = fake.random_letter().upper() mrn = f"{rng.randint(1000000, 9999999)}" dob = fake.date_of_birth(minimum_age=18, maximum_age=95) study_date = fake.date_time_this_decade() institution = rng.choice(INSTITUTION_POOL) return { "case_uuid": f"SYNTH-{uuid.UUID(int=rng.getrandbits(128))}", "patient_name_display": f"{last}, {first} {middle}.", "patient_name_dicom": f"{last}^{first}^{middle}", # DICOM PN VR format "patient_id": mrn, "dob": dob, "study_date": study_date, "institution_name": institution, }