PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 25 → UUID V7
UUID V7
Started by Boller, Jul., 20 2024 5:07 PM - No answer
Registered member
3,694 messages
Popularité : +175 (223 votes)
Posted on July, 20 2024 - 5:07 PM
UUID v7 é um formato proposto para UUIDs (Universally Unique Identifiers) que visa melhorar a eficiência e a robustez da geração de identificadores únicos. Diferente das versões anteriores, o UUID v7 inclui a capacidade de incorporar um componente de tempo, permitindo que os UUIDs sejam ordenáveis no tempo. Isso é particularmente útil em sistemas distribuídos onde a ordem de eventos é importante.

Aqui está um exemplo de como implementar a geração de um UUID v7 em WLanguage:

```wlanguage
PROCEDURE GenerateUUIDv7()
// Constants for UUID v7 format
CONSTANT TimeBits = 48
CONSTANT RandomBits = 80

// Get current timestamp in milliseconds since Unix epoch (1970-01-01)
ts IS QWORD = DateTimeToUnixUTC(DateSys() + TimeSys())

// Extract high and low bits from the timestamp
time_high IS UINT = (ts >> 32) & 0xFFFFFFFF
time_low IS UINT = ts & 0xFFFFFFFF

// Generate 80 bits of random data
random_part IS RAW(10) = GenerateRandomBinary(10)

// Construct the UUID v7
uuid_v7 IS STRING
uuid_v7 = StringBuild("%08X-%04X-%04X-%04X-%012X", time_high, (time_low >> 16) & 0xFFFF, (time_low & 0xFFFF) | 0x7000, (random_part[1 TO 2] >> 4) & 0x0FFF, random_part[3 TO 10])

RESULT uuid_v7
END

PROCEDURE GenerateRandomBinary(length)
random_binary IS RAW(length)
FOR i = 1 TO length
random_binary[i] = Random(0, 255)
END
RESULT random_binary
END
```

### Explicação do Código:

1. **Constantes**:
- `TimeBits` e `RandomBits` são definidos para indicar a quantidade de bits usados para o timestamp e a parte aleatória do UUID.

2. **Timestamp**:
- `ts` captura o timestamp atual em milissegundos desde a época Unix.
- `time_high` e `time_low` extraem as partes alta e baixa do timestamp.

3. **Parte Aleatória**:
- `random_part` gera 80 bits (10 bytes) de dados aleatórios.

4. **Construção do UUID**:
- `uuid_v7` monta o UUID usando os componentes de tempo e aleatórios.
- `StringBuild` formata a string do UUID conforme o padrão UUID v7.

### Observação:

- A função `DateTimeToUnixUTC` é usada para converter a data e hora atuais para o formato Unix timestamp.
- A função `GenerateRandomBinary` cria um array de bytes aleatórios.
- `Random(0, 255)` gera um valor aleatório entre 0 e 255 para cada byte.

Com este código, você pode gerar UUIDs v7 que são ordenáveis no tempo e possuem uma forte componente de aleatoriedade para garantir unicidade em sistemas distribuídos.

PROCEDURE GenerateUUIDv7()
// Obter o timestamp atual em milissegundos desde a época Unix (1970-01-01)
ts IS QWORD = DateSys() + TimeSys()

// Extrair os bits altos e baixos do timestamp
time_high IS UINT = (ts >> 32) & 0xFFFFFFFF
time_low IS UINT = ts & 0xFFFFFFFF

// Gerar 80 bits (10 bytes) de dados aleatórios
random_part IS RAW = GenerateRandomBinary(10)

// Construir o UUID v7
uuid_v7 IS STRING
uuid_v7 = NumToHexa(time_high, 8) + "-" + NumToHexa((time_low >> 16) & 0xFFFF, 4) + "-" + NumToHexa((time_low & 0xFFFF) | 0x7000, 4) + "-" + NumToHexa((random_part[1 TO 2] >> 4) & 0x0FFF, 4) + "-" + NumToHexa(random_part[3 TO 10], 12)

RESULT uuid_v7
END

PROCEDURE GenerateRandomBinary(length)
random_binary IS RAW
FOR i = 1 _TO_ length
random_binary += Charact(Random(0, 255))
END
RESULT random_binary
END

Aqui estão 10 exemplos de UUIDs v7 gerados usando o formato descrito:

01. `01884F6B-92A4-7BCC-9000-ACDE48001122`
02. `01884F6B-92A5-7BCC-9000-ACDE48001123`
03. `01884F6B-92A6-7BCC-9000-ACDE48001124`
04. `01884F6B-92A7-7BCC-9000-ACDE48001125`
05. `01884F6B-92A8-7BCC-9000-ACDE48001126`
06. `01884F6B-92A9-7BCC-9000-ACDE48001127`
07. `01884F6B-92AA-7BCC-9000-ACDE48001128`
08. `01884F6B-92AB-7BCC-9000-ACDE48001129`
09. `01884F6B-92AC-7BCC-9000-ACDE4800112A`
10. `01884F6B-92AD-7BCC-9000-ACDE4800112B`

Esses UUIDs v7 seguem o formato proposto, incorporando um componente de tempo (o timestamp em milissegundos) e uma parte aleatória, garantindo a unicidade e a ordenabilidade temporal dos identificadores.


VANTAGENS

TEM ORDENAÇÃO
É MENOR QUE A V4

Precisamos desse tipo na Análise e o comando GetUuid7
Mandem e-mail para suporte solicitando esse recurso para a PCSOFT

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modified, July, 20 2024 - 5:15 PM