
# 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()` изчиства монотонното състояние на ниво процес между тестовите случаи.
