Перейти до вмісту

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() очищує глобальний монотонний стан процесу між тестами.