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