2022-02-03 18:10:14
А вы знали, что существует черновик стандарта-RFC для UUID версий 6, 7 и 8?
Большинство людей понимает под UUID его четвёртую версию, генерируемую случайным образом. Но уже давно существует ещё и детерминированные версии — основанные на времени и MAC-адресе UUIDv1 и v2, а также UUIDv3 и v5, основанные на хэшировании.
Тем не менее, на практике в современном распределённом мире у всех этих версий есть проблемы:
1. случайно распределённые значения UUIDv4 плохо сказываются на производительности и размере BTree-индексов в базах данных (см. например, UUIDs are Popular, but Bad for Performance от Percona). Эта же проблема есть у UUID версий 1 и 2, так как…
2. …хоть UUIDv1 и UUIDv2 и основаны на времени, но при кодировании метки времени её компоненты оказываются перемешаны, поэтому идентификаторы нельзя сравнивать друг с другом «в лоб», побайтово, что, как минимум, неудобно.
3. А ещё в UUIDv1 и UUIDv2 должны использоваться реальные MAC-адреса машин, генерирующих идентификаторы, что, с одной стороны, не очень хорошо с точки зрения приватности, а с другой — уже и вовсе странно в век контейнеризации.
При всём этом UUID всё же слишком привлекательны, чтобы их не использовать: возможность генерировать идентификаторы независимо в приложении или распределённой базе данных, большое количество возможных значений (а значит и пренебрежимо малая вероятность коллизий при должной реализации), и всё это помноженное на действительно универсальную поддержку формата.
Сторонних решений, исправляющих эти недочёты, есть уже немало. Из более совместимых c UUID можно выделить ULID, но есть и множество других форматов: например, Snowflake или EID.
Авторы грядущего RFC создавали новые версии UUID с оглядкой на существующие решения (полный список можно посмотреть в черновике), но, конечно же, сохраняя совместимость с существующими UUID (вы же знали, что не все биты в UUIDv4 случайны?)
Что внутри?
• UUIDv6 — максимально похож на UUIDv1 (тот же таймстамп для григорианского календаря), но без переставления частей таймстампа (для сортировки) и со случайными данными вместо MAC-адреса.
• UUIDv7 — использует Unix timestamp (36 бит) с опциональной точностью до милли-, микро- или наносекунд (12, 24 или 38 бит), clock sequence (12, 14 или 8 бит) и произвольные данные.
• UUIDv8 — «свободный» формат, не регламентирующий, какие метки времени использовать. Можно использовать любые до 60 бит, главное условие — монотонное возрастание по времени. Ну, clock sequence (12 или 8 бит) и произвольные данные (62 или 54 бита).
Что же станет стандартом де-факто через несколько лет? Или UUIDv4 не победить? Поживём — увидим!
1.4K views15:10