
# UUIDv7

Vsak ID zapisa storh je UUIDv7: 48-bitni časovni žig v milisekundah, ki mu sledi naključna entropija, oblikovan kot standardni 36-mestni UUID. Ker je časovni žig na začetku, so ID-ji razvrščeni po času nastanka in ta lastnost omogoča večino funkcij storh: ostranjevanje s kazalcem (`after($id)`), branje časovnih razponov, preskakovanje segmentov v dnevniku in stabilno razvrščanje povsod.

```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);
```

Ustvarjanje je v posameznem procesu monotono: ID-ji, ustvarjeni v isti milisekundi, povečajo prejšnjo naključno vrednost, namesto da bi jo znova naključno določili, zato so tudi hitri valovi zapisov razvrščeni po vrstnem redu nastanka.

## Naslavljanje po času

Za časovna okna storh izpelje najmanjši in največji možni UUIDv7 za časovni žig v milisekundah ter primerja ID-je s temi mejami:

```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);
```

Zato za branje časovnih razponov v podatkih zapisa ni potrebno časovno polje: ID vsebuje čas nastanka.

## Uporaba lastnih ID-jev

Vsi pogoni sprejmejo izrecni ID za posamezen zapis (`$docs->put($data, $id)`) in funkcijo `id_generator` v konstruktorjih. ID-ji iz obeh poti so preverjeni kot UUIDv7, zato jih morajo ustvariti tudi generatorji po meri; deterministični generatorji omogočajo, da testna zbirka ustvari ponovljive testne podatke.
`UuidV7::reset_for_tests()` počisti stanje monotonosti na ravni procesa med posameznimi testnimi primeri.
