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.
$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:
$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.