UUIDv7
UUIDv7 обеспечивает запредельную скорость работы баз данных
Седьмая версия UUID (Universally Unique Identifier Version 7, UUID Version 7, UUIDv7) является модифицированной и стандартизованной версией ULID. Проект стандарта (далее — стандарт) находится в ожидании окончательной проверки редактором. Но уже есть большое количество реализаций UUIDv7, применяемых в действующих информационных системах. В интернете доступно большое количество информации по ключевому слову UUIDv7.
Целями разработки UUIDv7 были устранение существенных недостатков UUID и стандартизация (отсутствующая у ULID) — для широкого использования UUIDv7 «по умолчанию» вместо других составных идентификаторов и автоинкремента (целых чисел) в качестве суррогатных ключей в базах данных и в качестве ключей в распределенных информационных системах (а также в других указанных в стандарте целях).
В крайнем левом сегменте UUIDv7 находится метка времени эпохи Unix в миллисекундах (timestamp), благодаря чему генерируемые UUIDv7 как правило возрастают по времени (это так называемая монотонность) и поэтому гораздо быстрее находятся в базах данных. В продвинутых реализациях между меткой времени и псевдослучайным сегментом есть инициализируемый псевдослучайным числом счетчик (Fixed-Length Dedicated Counter), что обеспечивает возрастание генерируемых UUIDv7 при неизменной метке времени внутри миллисекундного интервала.
Стандарт содержит требования безопасности:
для сокрытия даты создания записей разрешает сдвиг метки времени относительно реальной даты и времени на любую величину (но не допускает заполнения метки времени данными, не зависящими от текущего времени, чтобы обеспечить монотонность и защиту от коллизий)
запрещает парсинг UUIDv7 без крайней необходимости, в том числе, для извлечения и использования метки времени
требует реализовать защиту от перевода часов назад
описывает способы защиты от переполнения счетчика
для защиты от атак перебором идентификатора требует заполнить крайний правый сегмент UUIDv7 псевдослучайными данными, сгенерированными специально для каждого UUIDv7
требует реализовать защиту от отсутствия доступа к генератору истинно случайных чисел, которые нужны как «соль» для инициализации псевдослучайных данных
Стандарт намеренно оставляет некоторые важные вопросы на усмотрение разработчиков реализации. Поэтому реализации UUIDv7 существенно отличаются друг от друга структурой UUIDv7, источниками времени и энтропии, алгоритмами, надежностью, монотонностью и производительностью.
Стандарт разрешает использовать UUIDv7 в качестве левого сегмента ключа. При этом правый сегмент ключа может быть заполнен любыми метаданными и контрольной суммой.
Слева от метки времени UUIDv7 не могут быть помещены никакие части ключа, но при необходимости разнести UUIDv7 подальше в таблице можно воспользоваться разрешенным сдвигом метки времени.
Стандарт разрешает использовать UUIDv7 вместе с другими идентификаторами. Например, в записи может храниться UUIDv7, сгенерированный базой данных, а также, для обеспечения целостности и обратной связи, ключ из системы-источника, который тоже может быть UUIDv7.
Стандарт содержит приоритеты использования UUIDv7 и других версий UUID. В большинстве случаев рекомендована седьмая версия, а в редких случаях, когда монотонность UUID не важна, рекомендована четвертая версия.