Смещение значения таймстемпа UUIDv7

9ca699ad7182b36f4edd5f8fdb6aacec.jpg

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

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

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

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

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

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

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

© Habrahabr.ru