
# UUIDv7

Každé ID záznamu storh je UUIDv7: 48-bitová časová značka v milisekundách, za ktorou nasleduje náhodná entropia, vo formáte štandardného 36-znakového UUID. Keďže časová značka je na začiatku, ID sa triedia podľa času vytvorenia a táto vlastnosť umožňuje väčšinu funkcií storh: stránkovanie pomocou kurzora (`after($id)`), čítanie v časovom rozsahu, preskakovanie segmentov v zázname a stabilné usporiadanie všade.

```php
$id = Storh\UuidV7::generate();

Storh\UuidV7::is_valid($id);          // bool, accepts upper and lower case
Storh\UuidV7::assert_valid($id);      // throws StorageException instead
$timestampMs = Storh\UuidV7::timestamp_ms($id);
```

Generovanie je v rámci procesu monotónne: ID vytvorené v tej istej milisekunde zvýši predchádzajúcu entropiu namiesto jej opätovného náhodného generovania, takže sa aj rýchle dávky zápisov naďalej triedia podľa poradia vytvorenia.

## Adresovanie podľa času

Pre časové okná storh odvodí najmenšie a najväčšie možné UUIDv7 pre časovú značku v milisekundách a porovná ID s týmito hranicami:

```php
$query = Storh\RecordQuery::all()->time_range_ms(
    1_700_000_000_000,
    1_700_000_060_000,
);

$lower = Storh\UuidV7::min_for_timestamp_ms(1_700_000_000_000);
$upper = Storh\UuidV7::max_for_timestamp_ms(1_700_000_060_000);
```

Preto pri čítaní v časovom rozsahu netreba v údajoch záznamu časovú značku: ID obsahuje čas vytvorenia.

## Zadávanie vlastných ID

Všetky moduly prijímajú pri každom zápise explicitné ID (`$docs->put($data, $id)`) a v konštruktoroch aj volateľný objekt `id_generator`. ID získané ktorýmkoľvek z týchto spôsobov sa validujú ako UUIDv7, preto ich vlastné generátory musia vytvárať; deterministické generátory umožňujú testovacej sade vytvárať reprodukovateľné testovacie údaje.
`UuidV7::reset_for_tests()` vymaže monotónny stav na úrovni procesu medzi testovacími prípadmi.
