diff --git a/src/renatoxsr/utils/uuid7_base58.py b/src/renatoxsr/utils/uuid7_base58.py new file mode 100644 index 0000000..83ffb66 --- /dev/null +++ b/src/renatoxsr/utils/uuid7_base58.py @@ -0,0 +1,55 @@ +import sys +import uuid +import base58 + +### Garante suporte nativo no Python 3.14+ ou usa fallback para versões anteriores + +if sys.version_info >= (3, 14): +from uuid import uuid7 +else: +from uuid6 import uuid7 + +def uuid7_to_base58() -> tuple[str, str]: +"""Gera um UUIDv7 e o codifica em uma string compacta Base58.""" + +### 1. Gera o UUIDv7 padrão (128 bits / 16 bytes) + +u7 = uuid7() + +### 2. Transforma os 16 bytes do UUID em Base58 (sem o checksum do Bitcoin) + +# .zfill(22) garante que ele sempre tenha 22 caracteres se houver zeros à esquerda + +encoded_b58 = base58.b58encode(u7.bytes).decode('utf-8').zfill(22) + +return str(u7), encoded_b58 + +def base58_to_uuid7(b58_string: str) -> str: +"""Decodifica uma string Base58 de volta para o formato original de UUIDv7.""" + +### 1. Decodifica a string de volta para os 16 bytes originais + +decoded_bytes = base58.b58decode(b58_string) + +### 2. Reconstrói o objeto UUID a partir dos bytes + +return str(uuid.UUID(bytes=decoded_bytes)) + +### --- Demonstração de Uso --- + +if **name** == "**main**": + +### Gerando o ID compactado + +uuid_original, id_base58 = uuid7_to_base58() + +print(f"UUIDv7 Original (36 chars): {uuid_original}") +print(f"UUIDv7 em Base58 (22 chars): {id_base58}") + +### Revertendo para provar que é bidirecional (lossless) + +uuid_revertido = base58_to_uuid7(id_base58) +print(f"Decodificado de volta: {uuid_revertido}") + +assert uuid_original == uuid_revertido, "Erro: Os UUIDs não coincidem!" +print("\nSucesso! Conversão perfeita e segura para URLs.") \ No newline at end of file