feat: Implement GeneradorIDUnico class for unique ID generation and verification
This commit is contained in:
@@ -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")
|
||||||
Reference in New Issue
Block a user