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

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

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

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

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

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

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

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

@SergeyProkhorenko
04.11.2024 02:05 UTC
Первоисточник

Комментарии

@MountainGoat
03.11.2024 21:22 UTC
+7

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

@SergeyProkhorenko
03.11.2024 23:23 UTC
-7

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

@apevzner
03.11.2024 22:17 UTC
+3

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

@SergeyProkhorenko
03.11.2024 23:21 UTC
0

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

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

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

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

@andnotor
04.11.2024 08:47 UTC
+5

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

@SergeyProkhorenko
04.11.2024 10:57 UTC
0

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

@baldr
07.11.2024 18:32 UTC
+2

На самом деле, статья, действительно, полезная. Даже если бы её написал ChatGPT - лично мне этот факт о смещении очень пригодился и достаточно кратко объяснено. Недавно решил использовать UUIDv7 в базе и тоже немного напрягла сквозная отметка времени. Теперь буду знать что это может быть не так опасно.

@SergeyProkhorenko
23.11.2024 09:39 UTC
0

В Percona Server for MySQL тоже используется сдвиг значения таймстемпа (в миллисекундах, положительный или отрицательный), чтобы скрыть время создания записи.

"UUID_V7() generates a UUID of version seven (timestamp-based). The function takes no arguments or one integer argument. The argument is a number of milliseconds to shift the timestamp of UUID forth or back if the argument is negative. If there is no argument, timestamp shift is not performed. Timestamp shift may be used to hide the actual time of the record creation."

Источник

Ссылка на документацию

Я тоже начинал со сдвига в миллисекундах, пока не обнаружил в PostgreSQL более удобный тип данных interval