diff --git a/src/Security/GenerarIDs.py b/src/Security/GenerarIDs.py new file mode 100644 index 0000000..3283f79 --- /dev/null +++ b/src/Security/GenerarIDs.py @@ -0,0 +1,67 @@ +import uuid +import datetime +import re + +class GeneradorIDUnico: + def __init__(self, tipo_objeto: str): + if not re.match(r'^[A-Z]{4}$', tipo_objeto): + raise ValueError("El tipo de objeto debe tener 4 letras en mayúscula (ej: ABCD)") + self.tipo_objeto = tipo_objeto + + def generar(self): + f = datetime.datetime.now().strftime('%Y%m%d') + u = uuid.uuid4().hex[:9] + n = ''.join(filter(str.isdigit, uuid.uuid4().hex))[:8] + n = n.ljust(8, '0') + t = sum(int(c) for c in f) + t += sum(int(c, 16) for c in u) + t += sum(int(c) for c in n) + c = str(t % 10) + l = t + int(c) + d = hex(l % 16)[-1] + + return f"{self.tipo_objeto}{f}-{d}{u}{c}{n}" + + + @staticmethod + def verificar(id_: str) -> bool: + try: + f = id_[4:12] + cuerpo = id_[13:] + d = cuerpo[0] + u = cuerpo[1:10] + c = cuerpo[10] + n = cuerpo[11:19] + t = sum(int(c) for c in f) + t += sum(int(c, 16) for c in u) + t += sum(int(c) for c in n) + esd = str(t % 10) + l = t + int(esd) + esh = hex(l % 16)[-1] + return ( + d.lower() == esh.lower() and + c == esd + ) + except Exception: + return False + + @staticmethod + def tamaño_bytes_bits(id_: str): + """Devuelve el tamaño del ID en bytes y bits (UTF-8)""" + bytes_ = len(id_.encode('utf-8')) + return bytes_, bytes_ * 8 + + +if __name__ == "__main__": + # Ejemplo de uso + generador = GeneradorIDUnico("FACT") + nuevo_id = generador.generar() + print(f"Nuevo ID generado: {nuevo_id}") + + # Verificación del ID + es_valido = GeneradorIDUnico.verificar(nuevo_id) + print(f"El ID es válido: {es_valido}") + + # Tamaño del ID + bytes_, bits_ = GeneradorIDUnico.tamaño_bytes_bits(nuevo_id) + print(f"Tamaño del ID: {bytes_} bytes / {bits_} bits")