Lewati ke konten

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.