Adicionar src/renatoxsr/utils/uuid7_base58.py

This commit is contained in:
2026-09-17 08:17:53 -03:00
parent 635af71793
commit c513dc6e74
+55
View File
@@ -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.")