UUIDv7
Ідентифікатор кожного запису storh — це UUIDv7: 48-бітова часова мітка з точністю до мілісекунд, за якою йдуть
випадкові дані; формат — стандартний UUID завдовжки 36 символів. Оскільки першою йде
часова мітка, ідентифікатори сортуються за часом створення, а ця властивість лежить в основі більшості функцій storh: пагінації за курсором (after($id)), читання за часовим інтервалом, пропуску сегментів
у журналі та стабільного сортування всюди.
$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 для часової мітки з точністю до мілісекунд і порівнює ідентифікатори з цими межами:
$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() очищує глобальний монотонний стан процесу між тестами.