
# UUIDv7

Hvert storh-post-id er en UUIDv7: et tidsstempel på 48 bit i millisekunder efterfulgt af
tilfældig entropi, formateret som en standard-UUID på 36 tegn. Da tidsstemplet står først,
sorteres id'er efter oprettelsestid, og den ene egenskab understøtter det meste af storh: markørbaseret sideinddeling (`after($id)`), læsning af tidsintervaller, overspringning af segmenter
i loggen og stabil sortering overalt.

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

Genereringen er monoton inden for en proces: id'er, der oprettes i samme millisekund,
øger den foregående entropi i stedet for at generere den igen, så hurtige skrivebølger
stadig sorteres efter oprettelsesrækkefølge.

## Tidsbaseret opslag

For tidsintervaller udleder storh den mindste og største mulige UUIDv7 for et
tidsstempel i millisekunder og sammenligner id'er med disse grænser:

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

Derfor kræver læsning af tidsintervaller ikke et tidsstempelfelt i postdataene: id'et indeholder oprettelsestidspunktet.

## Angivelse af egne id'er

Alle motorer accepterer et eksplicit id ved hver skrivning (`$docs->put($data, $id)`) og en `id_generator` i deres konstruktører. Id'er fra begge veje valideres som UUIDv7, så brugerdefinerede generatorer skal producere dem; deterministiske generatorer gør det muligt for testsuiten at oprette reproducerbare fixtures. `UuidV7::reset_for_tests()` nulstiller den monotone tilstand på procesniveau mellem testtilfælde.
