
# 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()`로 초기화합니다.
