
# UUIDv7

Jokainen storh-tietueen tunniste on UUIDv7: 48-bittinen millisekuntiaikaleima, jota seuraa satunnainen entropia ja joka on muotoiltu tavalliseksi 36 merkin UUID-tunnisteeksi. Koska aikaleima on alussa, tunnisteet järjestyvät luontiajan mukaan, ja tämä ominaisuus mahdollistaa useimmat storh-toiminnot: kursorisivutuksen (`after($id)`), aikaväliluvut, segmenttien ohituksen lokissa ja vakaan järjestyksen kaikkialla.

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

Luonti on prosessin sisällä monotonista: samalla millisekunnilla luodut tunnisteet kasvattavat edellistä entropia-arvoa sen sijaan, että arvo arvottaisiin uudelleen, joten nopeat kirjoituspiikit säilyvät luontijärjestyksessä.

## Aikakohdistus

Aikaikkunoita varten storh johtaa pienimmän ja suurimman mahdollisen UUIDv7-arvon millisekuntiaikaleimalle ja vertaa tunnisteita näihin rajoihin:

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

Siksi aikaväliluvuissa ei tarvita aikaleimakenttää tietueen tiedoissa: tunniste sisältää luontiajan.

## Omien tunnisteiden käyttäminen

Kaikki moottorit hyväksyvät kirjoituskohtaisen tunnisteen (`$docs->put($data, $id)`) ja `id_generator`-kutsuttavan konstruktorissaan. Kummastakin lähteestä tulevat tunnisteet validoidaan UUIDv7-tunnisteiksi, joten omien generaattorien on tuotettava niitä; determinististen generaattorien avulla testisarja luo toistettavia testitietoja. `UuidV7::reset_for_tests()` tyhjentää prosessitason monotonisen tilan testitapausten välillä.
