UUIDv7
모든 storh 레코드 ID는 UUIDv7입니다. 48비트 밀리초 타임스탬프 뒤에 무작위 엔트로피가 오며, 표준 36자 UUID 형식으로 표시됩니다. 타임스탬프가 앞에 있으므로 ID는 생성 시간순으로 정렬되며, 이 속성 하나가 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);
프로세스 내 생성 순서는 단조롭게 유지됩니다. 같은 밀리초에 생성된 ID는 엔트로피를 다시 뽑는 대신 이전 값을 증가시키므로, 쓰기가 급증해도 생성 순서대로 정렬됩니다.
시간 기준 조회
시간 범위에서는 storh이 밀리초 타임스탬프에 가능한 가장 작은 값과 가장 큰 UUIDv7을 계산하고, ID를 이 경계와 비교합니다:
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);
따라서 시간 범위 읽기에는 레코드 데이터의 타임스탬프 필드가 필요하지 않습니다. 생성 시간이 ID에 포함되어 있기 때문입니다.
사용자 지정 ID 지정
모든 엔진은 쓰기마다 명시적 ID($docs->put($data, $id))를 지정하는 기능과 생성자에 전달하는 id_generator 콜러블을 지원합니다. 두 경로에서 생성한 ID는 UUIDv7로 검증되므로 사용자 지정 생성기도 이에 맞는 값을 반환해야 합니다. 테스트 스위트는 결정적 생성기를 사용해 재현 가능한 픽스처를 만듭니다.
테스트 사례 사이의 프로세스 수준 단조 상태는 UuidV7::reset_for_tests()로 초기화합니다.