Към съдържанието

UUIDv7

Всеки идентификатор на запис storh е UUIDv7: 48-битов времеви отпечатък в милисекунди, последван от случайна ентропия, форматиран като стандартен UUID с 36 знака. Тъй като времевият отпечатък е в началото, идентификаторите се сортират по време на създаване и това свойство е в основата на повечето функции на storh: странично прелистване с курсор (after($id)), четене по времеви диапазон, пропускане на сегменти в журнала и стабилно подреждане навсякъде.

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

Генерирането е монотонно в рамките на процеса: идентификаторите, създадени в една и съща милисекунда, увеличават предишната стойност на ентропията, вместо да я генерират наново, така че бързите изблици на записи пак се подреждат по реда на създаване.

Достъп по време

За времеви интервали storh извежда най-малката и най-голямата възможна стойност UUIDv7 за времеви отпечатък в милисекунди и сравнява идентификаторите с тези граници:

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

Ето защо четенето по времеви диапазон не изисква поле за времеви отпечатък в данните на записа: идентификаторът съдържа времето на създаване.

Предоставяне на собствени идентификатори

Всички енджини приемат изричен идентификатор при всяко записване ($docs->put($data, $id)) и id_generator в конструкторите си. Идентификаторите от двата начина се валидират като UUIDv7, затова персонализираните генератори трябва да ги създават; детерминистичните генератори позволяват на тестовия набор да създава възпроизводими тестови данни. UuidV7::reset_for_tests() изчиства монотонното състояние на ниво процес между тестовите случаи.