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