#!/usr/bin/env python3 """ids.py — identificadores DETERMINISTAS para lo que se genera (SDD 29). Derivar el id del nombre en vez de sortearlo es lo que vuelve **revisable** un fichero generado: dos corridas del mismo censo producen la misma semilla byte a byte y se comparan con `diff`. Un id aleatorio obliga a leer el fichero entero para saber si algo cambió. """ import hashlib CROCKFORD = "0123456789ABCDEFGHJKMNPQRSTVWXYZ" # sin I, L, O, U def ulid_determinista(sem, nombre): """26 caracteres Crockford base32, derivados del nombre. No es un ULID con marca de tiempo real —no hace falta— pero respeta el formato.""" h = hashlib.blake2b(f"{sem}/{nombre}".encode(), digest_size=16).digest() n = int.from_bytes(h, "big") out = [] for _ in range(26): out.append(CROCKFORD[n & 31]) n >>= 5 s = "".join(reversed(out)) return "0" + s[1:] # el primer carácter de un ULID válido es <= '7'