Что такое Сколько символов в UUID?
UUID — это значение размером 128 бит. В канонической записи оно занимает 36 символов: пять групп из 8, 4, 4, 4 и 12 шестнадцатеричных цифр, разделённых четырьмя дефисами. Уберите дефисы — останется 32 символа, то есть ровно 32 × 4 = 128 бит без потерь и добавлений.
В родном виде это 16 байт: тип uuid в PostgreSQL, uniqueidentifier в SQL Server, BINARY(16) в MySQL. Именно эту форму стоит предпочитать: она более чем вдвое меньше текстовой и сравнивается намного быстрее, потому что база сравнивает 16 байт, а не разбирает строку из 36 символов.
Не все 128 бит — полезная нагрузка. Шесть из них служебные: четыре бита хранят версию, два — вариант. В UUID v4 остаётся 122 случайных бита. Это по-прежнему огромное пространство — 5.3 × 1036 возможных значений, — но именно поэтому энтропию v4 указывают как 122, а не 128.
Как использовать
- Копируйте канонические 36 символов для людей, документации и конфигов.
- Убирайте дефисы для логов, компактных ключей и всего, что должно попадать в фиксированную ширину.
- Храните 16 байт в родном типе, если столбец индексируется; а разбор длины ниже пригодится, когда спросят, почему UUID — не 128 символов.
Сценарии
- Выбор типа столбца:
CHAR(36)против родных 16 байт — от этого зависит размер индекса. - Логи фиксированной ширины, где нужно знать заранее, 32 символа в поле или 36.
- Решения по интерфейсу: зная, что v4 занимает 36 символов, проще понять, обрезать его в таблице или показывать целиком.
Сравнение Сколько символов в UUID? с другими форматами
| Вариант | Когда использовать |
|---|---|
36 символов | Канонические <code>8-4-4-4-12</code> с дефисами. То, что видно и копируется. |
32 символа | То же значение без дефисов; по-прежнему 128 бит. |
16 байт | Родное хранение в <code>uuid</code>, <code>uniqueidentifier</code> или <code>BINARY(16)</code>. |
22 символа | Base64url — те же 16 байт, самая короткая текстовая форма без потерь. |
128 бит | Полезная нагрузка: 122 случайных бита в v4 плюс 6 на версию и вариант. |
Примеры кода
Длина в коде
import uuid
u = uuid.uuid4()
len(str(u)) # 36
len(u.hex) # 32
len(u.bytes) # 16, байты
u.int # 128-битное целое
# Base64url — самая короткая текстовая форма без потерь
import base64
len(base64.urlsafe_b64encode(u.bytes).rstrip(b'=')) # 22
Размер столбца
-- PostgreSQL: родной тип, 16 байт на диске
CREATE TABLE items (id uuid PRIMARY KEY DEFAULT gen_random_uuid());
-- MySQL: BINARY(16) вместо CHAR(36)
CREATE TABLE items (id BINARY(16) PRIMARY KEY);
-- SQL Server: UNIQUEIDENTIFIER вместо VARCHAR(36)
CREATE TABLE items (id UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID());
Сокращение UUID
// 36 символов -> 22 без потерь
const hex = '550e8400e29b41d4a716446655440000';
const b64 = Buffer.from(hex, 'hex').toString('base64url');
console.log(b64.length); // 22
Частые вопросы
Почему в UUID 36 символов, а не 32?
Дефисы добавлены для читаемости: четыре разделителя превращают 32 hex-цифры в пять групп, которые гораздо проще просматривать и вычитывать. Само значение — 32 hex-цифры; уберите дефисы, и ничего, кроме записи, не изменится.
Сколько символов в GUID?
Столько же — 36 в форме D по умолчанию. В .NET есть и другие варианты: N — 32 символа без дефисов, B — 38 с фигурными скобками, P — 38 с круглыми, X — 68, потому что каждый байт записывается с префиксом 0x.
Можно ли сделать UUID короче?
Да, двумя способами. Без потерь: закодируйте те же 16 байт в base64url — получится 22 символа, и обратное преобразование даст исходное значение. С потерями: отбросьте байты — 12 байт дают 16 символов и 96 бит энтропии, 8 байт — 11 символов и 64 бита, что нормально для кеша, но слабо для постоянных ключей.