
# UUIDv7

Varje post-id i storh är en UUIDv7: en tidsstämpel på 48 bitar i millisekunder följd av
slumpmässig entropi, formaterad som en standard-UUID på 36 tecken. Eftersom
tidsstämpeln kommer först sorteras id:n efter skapandetid, och den egenskapen driver det mesta av storh: markörsidnumrering (`after($id)`), tidsintervallsläsningar, segmentskipning
i loggen och stabil sortering överallt.

```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 är monoton inom en process: id:n som skapas under samma millisekund
ökar den föregående entropin i stället för att slumpa om den, så snabba skrivningar
sorteras ändå i skapandeordning.

## Tidsåtkomst

För tidsfönster härleder storh minsta och största möjliga UUIDv7 för en
tidsstämpel i millisekunder och jämför id:n med dessa 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);
```

Därför behöver tidsintervallsläsningar inget tidsstämpelfält i postens data: id:t innehåller skapandetiden.

## Ange egna id:n

Alla motorer accepterar ett uttryckligt id per skrivning (`$docs->put($data, $id)`) och en
`id_generator`-anropbar funktion i sina konstruktörer. Id:n från båda vägarna
valideras som UUIDv7, så anpassade generatorer måste skapa sådana; deterministiska
generatorer skapar reproducerbara testdata.
`UuidV7::reset_for_tests()` rensar det processövergripande monotona tillståndet mellan
testfall.
