
# UUIDv7

Elke record-ID in storh is een UUIDv7: een tijdstempel van 48 bits in milliseconden, gevolgd door willekeurige entropie en opgemaakt als een standaard-UUID van 36 tekens. Omdat de tijdstempel vooraan staat, worden ID's op aanmaaktijd gesorteerd. Die ene eigenschap maakt de meeste functies van storh mogelijk: cursorpaginering (`after($id)`), leesbewerkingen binnen een tijdsbereik, segmenten overslaan in het log en overal stabiele sortering.

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

Generatie verloopt monotoon binnen één proces: ID's die in dezelfde milliseconde worden aangemaakt, verhogen de vorige entropiewaarde in plaats van een nieuwe te genereren. Zo blijven snelle schrijfuitbarstingen toch in volgorde van aanmaak gesorteerd.

## Adressering op tijd

Voor tijdsvensters bepaalt storh de kleinst en grootst mogelijke UUIDv7 voor een tijdstempel in milliseconden en vergelijkt het ID's met die grenzen:

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

Daarom hebben leesbewerkingen binnen een tijdsbereik geen tijdstempelveld in de recordgegevens nodig: de ID bevat de aanmaaktijd.

## Zelf ID's opgeven

Alle engines accepteren bij een schrijfopdracht een expliciete ID (`$docs->put($data, $id)`) en een `id_generator`-functie als aanroepbaar object in hun constructors. ID's uit beide bronnen worden gevalideerd als UUIDv7, dus eigen generators moeten zulke ID's opleveren; deterministische generators zijn de manier waarop de testsuite reproduceerbare fixtures maakt. `UuidV7::reset_for_tests()` wist de monotone status op procesniveau tussen testgevallen.
