
# UUIDv7

Setiap id rekaman storh adalah UUIDv7: stempel waktu milidetik 48-bit diikuti entropi acak, dengan format UUID standar 36 karakter. Karena stempel waktunya berada di awal, id diurutkan berdasarkan waktu pembuatan, dan sifat ini mendukung sebagian besar fitur storh: paginasi kursor (`after($id)`), pembacaan rentang waktu, melewati segmen dalam log, dan pengurutan stabil di mana pun.

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

Pembuatan id bersifat monotonik dalam satu proses: id yang dibuat pada milidetik yang sama menambah entropi sebelumnya alih-alih mengacak ulang, sehingga lonjakan penulisan cepat tetap terurut menurut urutan pembuatan.

## Pengalamatan waktu

Untuk rentang waktu, storh menghitung UUIDv7 terkecil dan terbesar yang mungkin untuk stempel waktu dalam milidetik, lalu membandingkan id dengan batas tersebut:

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

Inilah sebabnya pembacaan rentang waktu tidak memerlukan field stempel waktu dalam data rekaman: id sudah memuat waktu pembuatannya.

## Menggunakan id sendiri

Semua mesin menerima id eksplisit untuk setiap penulisan (`$docs->put($data, $id)`) dan callable `id_generator` di konstruktornya. Id dari kedua jalur divalidasi sebagai UUIDv7, jadi generator khusus harus menghasilkannya; generator deterministik digunakan test suite untuk membuat fixture yang dapat direproduksi. `UuidV7::reset_for_tests()` menghapus status monotonik tingkat proses di antara kasus pengujian.
