Смещение значения таймстемпа UUIDv7
UUIDv7 — это удобный и безопасный 128-битный уникальный идентификатор, который призван заменить целочисленные суррогатные ключи формата bigint в качестве первичного ключа в высоконагруженных базах данных и распределенных системах.
UUIDv7 содержит таймстемп, обеспечивающий быструю вставку в таблицу БД новых записей, индексируемых по этому идентификатору. Благодаря таймстемпу производительность БД с идентификаторами UUIDv7 такая же, как с идентификаторами формата bigint. Кроме того, таймстемп может быть использован в качестве ключа разбиения при секционировании (partitioning) по интервалам, а также может помочь в выявлении причин ошибок.
Однако таймстемп раскрывает дату и время создания записи, что может нарушать требования информационной безопасности. К счастью, RFC 9562 разрешает смещение таймстемпа (timestamp offset), что позволяет искажать истинные дату и время создания записи. Кроме того, при использовании смещения таймстемпа значения UUIDv7 могут быть достаточно равномерно распределены, что позволяет использовать их в качестве ключа дистрибуции при сегментировании (sharding).
Разработчики функций для генерации UUIDv7 уже проектируют использование параметра для задания смещения таймстемпа. В частности, в PostgreSQL смещение будет иметь тип interval. Но существует потребность в автоматическом расчете смещения таймстемпа.
С точки зрения информационной безопасности желательно, чтобы смещение таймстемпа было случайным (положительным или отрицательным), достаточно частым (не реже, чем раз в час) и происходило в случайные моменты времени. А для высокой производительности БД важно, чтобы смещение таймстемпа было не слишком частым (чтобы страницы данных в памяти были по возможности заполнены) — не чаще, чем раз в минуту.
Допустимый интервал смещения таймстемпа ограничен лишь тем, что значение самого таймстемпа должно укладываться в его допустимый интервал. В противном случае смещение не должно применяться.
При возникновении конфликтов блокировок целесообразно последовательно созданным UUIDv7 давать различные последовательные смещения из небольшого закольцованного списка смещений.