UUIDv7 – это удобный и безопасный 128-битный уникальный идентификатор, который призван заменить целочисленные суррогатные ключи формата bigint в качестве первичного ключа в высоконагруженных базах данных и распределенных системах.

UUIDv7 содержит таймстемп, обеспечивающий быструю вставку в таблицу БД новых записей, индексируемых по этому идентификатору. Благодаря таймстемпу производительность БД с идентификаторами UUIDv7 такая же, как с идентификаторами формата bigint. Кроме того, таймстемп может быть использован в качестве ключа разбиения при секционировании (partitioning) по интервалам, а также может помочь в выявлении причин ошибок.

Однако таймстемп раскрывает дату и время создания записи, что может нарушать требования информационной безопасности. К счастью, RFC 9562 разрешает смещение таймстемпа (timestamp offset), что позволяет искажать истинные дату и время создания записи. Кроме того, при использовании смещения таймстемпа значения UUIDv7 могут быть достаточно равномерно распределены, что позволяет использовать их в качестве ключа дистрибуции при сегментировании (sharding).

Разработчики функций для генерации UUIDv7 уже проектируют использование параметра для задания смещения таймстемпа. В частности, в PostgreSQL смещение будет иметь тип interval. Но существует потребность в автоматическом расчете смещения таймстемпа.

С точки зрения информационной безопасности желательно, чтобы смещение таймстемпа было случайным (положительным или отрицательным), достаточно частым (не реже, чем раз в час) и происходило в случайные моменты времени. А для высокой производительности БД важно, чтобы смещение таймстемпа было не слишком частым (чтобы страницы данных в памяти были по возможности заполнены) – не чаще, чем раз в минуту.

Допустимый интервал смещения таймстемпа ограничен лишь тем, что значение самого таймстемпа должно укладываться в его допустимый интервал. В противном случае смещение не должно применяться.

При возникновении конфликтов блокировок при параллельной вставке данных целесообразно последовательно созданным UUIDv7 давать различные последовательные смещения из небольшого закольцованного списка смещений.

Комментарии (6)


  1. MountainGoat
    03.11.2024 21:22

    ГПТ, ГПТ, я не твой... Отпусти меня, ГПТ...


    1. SergeyProkhorenko Автор
      03.11.2024 21:22

      Этот комментатор, видимо, никогда не видел откровенную чушь, которую обычно генерит ChatGPT (исключение - скрипты на Python, на котором его дрессировали), но читал, что кто-то пользуется ChatGPT для написания текстов. Очень легко кинуть грязью в другого, ничем не рискуя.


  1. apevzner
    03.11.2024 21:22

    Наверное, те, кто читал RFC 9562, и без того знают обо всем, что написано в этой статье. А кто не читал, ничего не поймут...


    1. SergeyProkhorenko Автор
      03.11.2024 21:22

      Ошибаетесь. RFC 9562 настолько объемный, сложный и запутанный, что все (включая разработчиков функций, реализующих UUIDv7) читают его "по диагонали", упуская важные детали.

      Практически все отзывы в интернете о UUIDv7 звучат примерно так: "UUIDv7 раскрывает дату создания записи, поэтому в приложениях, где важна криптостойкость, следует использовать bigint". То есть, никто даже не подозревает, что таймстемп можно искажать, и это разрешено RFC 9562. И в 99% функций, реализующих UUIDv7, таймстемп невозможно исказить, так как разработчики об этом не позаботились.

      В RFC 9562 нет совершенно ничего об автоматическом расчете смещения значения таймстемпа. Об этом Вы больше нигде не прочитаете в интернете.

      Если кто-то не читал RFC 9562 (таких 99% людей) и ничего не понял в этой статье (таких гораздо меньше), то советую им пройти по ссылкам и узнать для себя кое-что новое и интересное.


  1. andnotor
    03.11.2024 21:22

    Не могу гарантировать, что писал не человек, но формат мне подходит. Лишней воды в стиле "я Петя из компании Рога и Копыта, родился и вырос...." нет и очень хорошо. Так что спасибо за ознакомление с интересной темой.


    1. SergeyProkhorenko Автор
      03.11.2024 21:22

      Авторство очень легко проверить. Подсовываете текст статьи чату гпт и просите найти ошибки. И получаете кучи галиматьи и ахинеи, потому что чат гпт ни в зуб ногой.