Preskoči na vsebino

UUIDv7

Vsak ID zapisa storh je UUIDv7: 48-bitni časovni žig v milisekundah, ki mu sledi naključna entropija, oblikovan kot standardni 36-mestni UUID. Ker je časovni žig na začetku, so ID-ji razvrščeni po času nastanka in ta lastnost omogoča večino funkcij storh: ostranjevanje s kazalcem (after($id)), branje časovnih razponov, preskakovanje segmentov v dnevniku in stabilno razvrščanje povsod.

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

Ustvarjanje je v posameznem procesu monotono: ID-ji, ustvarjeni v isti milisekundi, povečajo prejšnjo naključno vrednost, namesto da bi jo znova naključno določili, zato so tudi hitri valovi zapisov razvrščeni po vrstnem redu nastanka.

Naslavljanje po času

Za časovna okna storh izpelje najmanjši in največji možni UUIDv7 za časovni žig v milisekundah ter primerja ID-je s temi mejami:

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

Zato za branje časovnih razponov v podatkih zapisa ni potrebno časovno polje: ID vsebuje čas nastanka.

Uporaba lastnih ID-jev

Vsi pogoni sprejmejo izrecni ID za posamezen zapis ($docs->put($data, $id)) in funkcijo id_generator v konstruktorjih. ID-ji iz obeh poti so preverjeni kot UUIDv7, zato jih morajo ustvariti tudi generatorji po meri; deterministični generatorji omogočajo, da testna zbirka ustvari ponovljive testne podatke. UuidV7::reset_for_tests() počisti stanje monotonosti na ravni procesa med posameznimi testnimi primeri.