
# UUIDv7

Kiekvienas storh įrašo ID yra UUIDv7: 48 bitų laiko žyma milisekundžių tikslumu, po kurios eina atsitiktinė entropija, suformatuota kaip standartinė 36 simbolių ilgio UUID. Kadangi laiko žyma pateikiama pirmiausia, ID rūšiuojami pagal sukūrimo laiką, o ši savybė įgalina daugumą storh funkcijų: puslapiavimą pagal žymeklį (`after($id)`), skaitymą pagal laiko intervalą, segmentų praleidimą žurnale ir stabilų rūšiavimą visur.

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

Viename procese ID generuojami monotoniškai: jei keli ID sukuriami tą pačią milisekundę, vietoj pakartotinio atsitiktinės reikšmės generavimo padidinamas ankstesnis entropijos skaitiklis, todėl net ir per trumpą laiką įrašytos duomenų serijos išlaiko sukūrimo tvarką.

## Laiko nurodymas

Laiko intervalams storh apskaičiuoja mažiausią ir didžiausią galimą UUIDv7 nurodytai milisekundės laiko žymai ir palygina ID su šiomis ribomis:

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

Todėl skaitant pagal laiko intervalą įrašo duomenyse nereikia laiko žymos lauko: sukūrimo laikas užkoduotas ID.

## Savų ID nurodymas

Visi varikliai priima aiškiai nurodytą ID kiekvienam įrašymui (`$docs->put($data, $id)`) ir `id_generator` iškviečiamąją funkciją konstruktoriuose. Abiem būdais pateikti ID tikrinami kaip UUIDv7, todėl pasirinktiniai generatoriai privalo juos generuoti; deterministiniai generatoriai leidžia testų rinkiniui kurti atkuriamus bandymo duomenis.
`UuidV7::reset_for_tests()` tarp testavimo atvejų išvalo proceso lygmens monotonišką būseną.
