sergio/takana
> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…
⎇ 9e50ea43a3e29095e81ddcbd7418e15e5e4b844e
scripts/mudanza/ids.py
Ñawpa willay
Pi imata llamkarqan
ch'uya
traducir: familia «servicio» — systemd → tarjeta de arje, y el pivote pasa a ser uno POR FAMILIA
1#!/usr/bin/env python3
2"""ids.py — identificadores DETERMINISTAS para lo que se genera (SDD 29).
3
4Derivar el id del nombre en vez de sortearlo es lo que vuelve **revisable** un fichero generado: dos
5corridas del mismo censo producen la misma semilla byte a byte y se comparan con `diff`. Un id
6aleatorio obliga a leer el fichero entero para saber si algo cambió.
7"""
8import hashlib
9
10CROCKFORD = "0123456789ABCDEFGHJKMNPQRSTVWXYZ" # sin I, L, O, U
11
12
13def ulid_determinista(sem, nombre):
14 """26 caracteres Crockford base32, derivados del nombre. No es un ULID con marca de tiempo real
15 —no hace falta— pero respeta el formato."""
16 h = hashlib.blake2b(f"{sem}/{nombre}".encode(), digest_size=16).digest()
17 n = int.from_bytes(h, "big")
18 out = []
19 for _ in range(26):
20 out.append(CROCKFORD[n & 31])
21 n >>= 5
22 s = "".join(reversed(out))
23 return "0" + s[1:] # el primer carácter de un ULID válido es <= '7'