Adicionar src/renatoxsr/utils/uuid7_base58.py
This commit is contained in:
@@ -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.")
|
||||||
Reference in New Issue
Block a user