Přejít k obsahu

UUIDv7

Každé ID záznamu storh je UUIDv7: 48bitové časové razítko v milisekundách následované náhodnou entropií ve standardním 36znakovém formátu UUID. Protože je časové razítko na začátku, ID se řadí podle času vytvoření a tato vlastnost umožňuje většinu funkcí storh: stránkování pomocí kurzoru (after($id)), čtení časových rozsahů, přeskakování segmentů v protokolu a stabilní řazení všude.

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

Generování je v rámci procesu monotónní: ID vytvořená ve stejné milisekundě zvýší předchozí náhodnou složku namísto jejího nového losování, takže se i rychlé dávky zápisů seřadí podle času vytvoření.

Adresování podle času

Pro časová okna storh odvodí nejmenší a největší možné UUIDv7 pro časové razítko v milisekundách a porovná ID s těmito mezemi:

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

Proto čtení časových rozsahů nepotřebuje v datech záznamu časové razítko: ID už čas vytvoření obsahuje.

Zadání vlastních ID

Všechny enginy přijímají při každém zápisu explicitní id ($docs->put($data, $id)) a ve svých konstruktorech id_generator. Id z obou cest se ověřují jako UUIDv7, takže vlastní generátory je musí vytvářet; deterministické generátory slouží k vytváření opakovatelných fixture v testovací sadě. UuidV7::reset_for_tests() mezi testovacími případy maže monotónní stav na úrovni procesu.