Command Palette

Search for a command to run...

Генератор UUID: V1, V4, V7 объяснено (и что на самом деле использовать)

Генератор UUID: V1, V4, V7 объяснено (и что на самом деле использовать)

T
Toolz Team
|Jul 1, 2026|16 Мин. читать

Часть коллекции Прочие инструменты

Генератор UUID

Сгенерируйте случайные UUID (универсально уникальные идентификаторы)

Открыть инструмент «Генератор UUID»

В первый раз, когда UUID действительно имели для меня значение, я перемещал SaaS, расположенный рядом с WordPress, из одного поля MySQL в установку с репликой для чтения и планом, который нужно было осколочить позже. идентификаторы автоинкрементов были в порядке в течение многих лет - пока две службы не начали вставлять в то, что станет одной и той же логической таблицей, и внезапно id = 42 Имелось в виду два разных ряда. В этот момент автоматический приращение перестает работать, и uuids — обычный ответ.

UUID — это 128-битное значение, которое вы можете генерировать на любой машине в любое время без координации и по-прежнему доверять, чтобы быть уникальным. Эта "не координация" - это вся точка: мобильное приложение в автономном режиме в самолете, три микросервиса и фоновый работник могут одновременно чекать ID и никогда не сталкиваться. Математическая поддержка, что уверенность действительно абсурдна, и я покажу вам, насколько абсурдно за секунду.

выше Генератор UUID на Toolz.dev создает одиночные или массовые UUID в нескольких версиях мгновенно, прямо в вашем браузере - удобно, когда вы ' вы закладываете таблицу или вам нужен одноразовый идентификатор для теста. в этом руководстве рассказывается о том, что на самом деле означают версии, какой из них выбрать в 2026 году, как сохранить их, не уничтожая индекс базы данных, а также об ошибках, которые я допустил, чтобы вы могли их пропустить.

TL;DR: Для новых первичных ключей базы данных в 2026 году сгенерируйте UUID V7- it's упорядочен по времени, поэтому он хорошо индексируется и не утекает оборудование, такое как v1. Использовать v4 Когда вы хотите чистую непредсказуемость. Храните их как родной uuid тип или BINARY(16), никогда VARCHAR(36), йо- Сделайте их навалом Генератор UUID, и соединить его с Конвертер времени отметки времени Чтобы прочитать время, запеченное в V7. Все клиенты, все бесплатно.


Что такое UUID, именно?

UUID (универсально уникальный идентификатор) - это 128-битное число, используемое для идентификации чего-либо без раздачи идентификаторов центральным органом. Microsoft называет то же самое GUID (уникальный идентификатор в глобальном масштабе); они' идентичны во всех отношениях, которые имеют значение. Каноническая текстовая форма состоит из 36 символов - 32 шестизначных цифр, разделенных на пять групп через дефис по 8-4-4-4-12:

550e8400-e29b-41d4-a716-446655440000

Две из этих шестнадцатеричных позиций aren't случайные данные - они're метаданные. 13-я шестнадцатеричная цифра кодирует версия (какая стратегия генерации сделала это), а первая цифра четвертой группы кодирует разновидность (какому стандарту макета он соответствует - 8, 9, a, или b для стандартных UUID). Итак, в приведенном выше примере 4 В третьей группе вам сообщается, что это V4.

Насколько уникальна «Уникальная», на самом деле?

После того, как биты версии и варианта зарезервированы, V4 UUID имеет 122 случайных бита. Это 2^122 возможные значения, или около 5,3 унций:

5,316,911,983,139,663,491,615,228,241,121,400,000

Чтобы задать конкретный вопрос: если вы генерировали миллиард UUID каждую секунду, вам потребуется примерно 86 лет, прежде чем вы достигнете даже 50% шансов одиночный столкновение в любом месте. С практической инженерной точки зрения столкновений V4 не бывает, и вы можете проектировать так, как будто никогда не будет.


В чем разница между UUID V1, V4 и V7?

Спецификация - изначально RFC 4122, теперь обновлено RFC 9562 (2024)- определяет несколько версий. Три вопроса для повседневной работы.

UUID v1 - метка времени + MAC-адрес

v1 сшивает временную метку длиной 100 наносекунд (считая с 15 октября 1582 года, даты начала григорианского календаря - одного из моих любимых фрагментов викторин) с помощью сетевой карты и MAC-адреса #39;s. Это и #39;s, естественно, упорядочено по времени, и вы можете извлечь из него время создания.

Проблема в том, что она есть в определении: он встраивает MAC-адрес машины, которая ее сделала. Это утечка аппаратного идентификационного оборудования и в сочетании с меткой времени делает ID несколько предсказуемыми. Пример: 6ba7b810-9dad-11d1-80b4-00c04fd430c8, йо- Я использую только v1 для совместимости с Legacy.

УУИД v4 - случайный

V4 — это 122 бита случайности и ничего больше. Это версия, которую большинство людей имеют в виду, когда говорят «uuid», и это совершенно просто: ни метки времени, ни оборудования, ни порядка. Пример: f47ac10b-58cc-4372-a567-0e02b2c3d479, йо-

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

UUID v7 - упорядоченный по времени + случайный

V7 — это современный компромисс, стандартизированный в RFC 9562. Первые 48 битов являются временной меткой Unix в миллисекундах, остальные случайны. Пример: 018e4880-d4d0-7b9c-8c37-2a5c0f1e3d8a, йо-

Этот макет означает сортировку идентификаторов v7 в хронологическом порядке - новые строки попадают в & quot;end & quot; индекса B-дерева вместо рассеяния - при этом он остается глобально уникальным и не требует координации. Он утекает приблизительное время создания (обычно хорошее), но не аппаратное обеспечение. Для новых проектов это мой основной ключ по умолчанию, и it's направление, которое теперь указывает IETF, также.

Вот компромисс с первого взгляда:

версия Заказывал? ненадежный лучше для
ст.1 Да (время) MAC-адрес + время Только устаревшие системы
v4 Нет (случайно) совсем Неудобные токены, общие идентификаторы
V7 Да (время) Примерное время создания Новые первичные ключи базы данных

Существуют и менее используемые версии: v3 и v5 являются детерминированными хэшами пространства имен плюс имя (v5 использует SHA-1 и предпочтительнее MD5 V3), V6 — это переупорядоченный V1, а V8 зарезервирован для индивидуальных реализаций.


Стоит ли использовать UUID или идентификаторы автоинкремента?

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

Придерживайтесь автоматического увеличения, когда у вас есть единая база данных, производительность и хранилище ограничены, и людям нужно читать идентификаторы. целое число - это 4 — 8 байт против UUID' 16, сравнение целых чисел происходит быстрее, и & quot; заказ #12345 & quot; гораздо проще прочитать телефон, чем 36-символьный UUID. В одной коробке без шардинга автоматическое увеличение действительно является более простым и быстрым выбором - не обращайтесь к UUID из моды.

Переключиться на UUID, когда все это правда: вы 'распределены (несколько служб или серверов, чеканящих идентификаторы независимо), вы ' беспокоитесь о перечислении (идентификаторы автоприращения угадываются и незаметно раскрывают количество ваших записей - /users/1234 Сообщает злоумышленнику, что у вас меньше 1235 пользователей), вам нужно объединить данные из нескольких баз данных без коллизий или хотите, чтобы клиенты генерировали идентификаторы перед синхронизацией. Эта точка перечисления является реальным соображением в области безопасности, недооценивающее людей.

И средние пороги V7: UUID V7 дает вам распределенное генерирование UUID а Упорядочение автоматического приращения без утечки. Для большинства новых проектов 2026 года, которым нужны непоследовательные идентификаторы, V7 — это ответ, который завершает дебаты.


Как вы храните UUID, не разрушая свой индекс?

Это раздел, рожденный моей дорогой ошибкой, так что будьте внимательны здесь, если больше нигде.

В этой миграции я упомянул новые UUID, как VARCHAR(36) потому что это было очевидное, читаемое дело. Это сработало - и тогда таблица выросла, а вставки и соединения стали заметно медленнее. усугублялись две проблемы: я тратил 36 байт на каждый идентификатор вместо 16, а Я использовал случайные UUID V4, поэтому каждая вставка приземлялась в случайном месте в индексе первичного ключа, фрагментируя его и дробя в буферном пуле. Исправлено хранение их как двоичное, а в следующем проекте переход на V7, поэтому вставки оставались секвентальными.

PostgreSQL Имеет родной uuid введите - используйте его. Он хранит 16 байт и быстро сравнивает:

CREATE EXTENSION IF NOT EXISTS "pgcrypto";

CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

MySQL не имеет собственного типа UUID, поэтому храните BINARY(16) и конвертировать с UUID_TO_BIN() / BIN_TO_UUID(), йо- Второй аргумент имеет значение:

CREATE TABLE users (
    id BINARY(16) PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- The `true` swaps the timestamp bytes for better index locality on v1
INSERT INTO users (id, name, email)
VALUES (UUID_TO_BIN(UUID(), true), 'Alice', '[email protected]');

SELECT BIN_TO_UUID(id, true) AS id, name, email FROM users;

Правило, которое нужно помнить: родной uuid Введите, где у вас есть, BINARY(16) где вы не, и VARCHAR(36) В основном никогда не за ключ, который вы индексируете и присоединяйтесь.


Как генерировать UUID в коде?

Для быстрого одноразового действия Генератор UUID быстрее, чем открытие реплики. В коде каждый основной язык имеет этот встроенный или шаг вперед.

JavaScript / TypeSc- браузер и Node теперь поставляют генератор v4:

const id = crypto.randomUUID();   // v4, no dependency needed
// For v7, use the 'uuid' package:
import { v7 as uuidv7 } from 'uuid';
const ordered = uuidv7();

питон:

import uuid
uuid.uuid4()                                  # random
uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com') # deterministic (SHA-1)

Ява: UUID.randomUUID() дает вам v4 из коробки; V7 нужна библиотека, как java-uuid-generator Или небольшая реализация RFC 9562.

ИДИТЕ: github.com/google/uuid дает вам оба - uuid.New() Для V4 и uuid.NewV7() для V7.

Обратите внимание, что нативные помощники среды выполнения почти всегда дают вам v4. Если вы специально хотите V7 для его заказа, вам обычно нужна библиотека, так как это более новый стандарт, и не все STDLIB догнали.


Где на самом деле появляются UUID в реальных системах?

О UUID легко говорить в абстрактном виде, так что вот конкретные места, на которые я полагался, потому что выбранная вами версия действительно зависит от работы.

Первичные ключи базы данных в распределенной установке. Это классический случай и тот, который начал эту статью для меня Момент, когда более чем один писатель может вставить в одну и ту же логическую таблицу - реплики, осколки или два сервиса, разделяющих схему - разрывы автоприращения. первичный ключ v7 решает проблему координации и по-прежнему индексирует чисто, потому что это 's упорядочено по времени.

Клиентские идентификаторы для автономных приложений. Мобильное приложение или браузер SPA часто нужно создать запись, прежде чем он сможет поговорить с сервером - подумайте о заметке, написанной на самолете, или об оптимистичном пользовательском интерфейсе, который мгновенно показывает новую строку. если клиент чеканит UUID заранее, запись имеет стабильный идентификатор с первого нажатия клавиши и синхронизируется позже без сервера туда и обратно в & quot; получите идентификатор. & quot; I& # 39; я использовал это, чтобы формы казались мгновенными даже при хрупких соединениях.

Неперечисляемые идентификаторы ресурсов в URL-адресах и API. толкание /orders/1042 В URL тихо сообщают кому-нибудь, что у вас было не более 1042 заказов, и позволяет им ходить /orders/1041, /orders/1040, и так далее. замена в UUID удаляет как утечку бизнес-метрики, так и простоту перечисления. Для всего, что пользователь может увидеть в URL-адресе, это стоит сделать - хотя помните, что UUID не является механизмом контроля доступа; за этим все еще нужны реальные проверки авторизации.

Идентификаторы корреляции для отслеживания. Когда один запрос выходит из пяти микросервисов, прикрепляя один UUID в качестве идентификатора корреляции и регистрируя его при каждом переходе & quot;где-то в этом беспорядке что-то не удалось & quot; в единую приветливую строку во всех ваших журналах. Это одно место, где даже простой v4 идеален - вам не нужен заказ, просто уникальность.

Ключи идемпотентности. API-интерфейсы в Интернете и часто просят клиента отправить UUID в качестве ключа идемпотентности, чтобы повторный запрос не заряжал карту дважды. Клиент генерирует его один раз, повторно использует его при повторных попытках, и сервер дедупирует его. Это небольшая модель, которая предотвращает очень дорогой класс жуков.


Часто задаваемые вопросы

Для чего используется UUID?

UUID однозначно идентифицирует что-либо - строку базы данных, ресурс API, сеанс, загруженный файл, трассировку микросервисов - без необходимости использования центральной службы для выдачи идентификаторов. It's - это то, когда несколько систем или клиентов должны создавать идентификаторы независимо и при этом быть уверены, что они выиграют 't конфликтуют. Вы можете сгенерировать его мгновенно с помощью Генератор UUID На Toolz.dev.

Могут ли две UUID быть идентичными?

Теоретически да, на практике нет. UUID V4 имеет 122 случайных бита, что дает около 5,3 недюбилионов. Вам нужно будет сгенерировать порядка 2,7 квинтиллион UUID, прежде чем достигнет 50% шансов даже на одно столкновение. Для каждой реальной инженерной цели вы можете рассматривать UUID как гарантированные уникальные.

Какую версию UUID мне использовать в 2026 году?

Для новых первичных ключей базы данных, UUID v7 - it's упорядочен по времени для эффективной индексации, оставаясь при этом глобально уникальным, и it's текущая рекомендация IETF в соответствии с RFC 9562.Используйте v4, когда непредсказуемость имеет значение, например идентификаторы, которые нельзя угадать. Избегайте v1 для новой работы, потому что он встраивает генерирующую машину's MAC-адрес.

Являются ли UUID последовательными?

v1 и v7 упорядочены по времени, поэтому идентификаторы, сгенерированные позже, сортируются после более ранних; v4 полностью случайен без порядка. Последовательный порядок - это то, что делает v7 дружественным к индексам B-дерева - новые строки добавляются, а не рассеиваются. Если вы ' используете случайный v4 в качестве основного ключа на большой таблице, отсутствие порядка может повредить производительности вставки и индекса.

Как мне хранить UUID в базе данных?

Используйте родной uuid Введите, если в вашей базе данных есть (имеет PostgreSQL). В противном случае хранить BINARY(16), а в MySQL 8.0+ конвертировать с UUID_TO_BIN() а BIN_TO_UUID(), йо- уклоняться VARCHAR(36) или CHAR(36) для ключей - хранилище строк тратит 20 байт в строке и замедляет каждое сравнение, что быстро складывается в больших таблицах.

В чем разница между UUID и GUID?

Они одно и то же. UUID — это термин из RFC 4122, используемый для большинства языков и платформ; GUID — это имя Microsoft для него, обычное в Windows и .NET. Формат и гарантии одинаковы, поэтому можно обрабатывать GUID и UUID взаимозаменяемо.

Могу ли я извлечь время создания из UUID?

Из v1, v6 и v7 да - они кодируют временную метку. v7 хранит миллисекундную временную метку Unix в своих первых 48 битах, которую вы можете декодировать и читать с помощью Конвертер времени отметки времени, йо- V4 и V5 не содержат информации о времени, поэтому из них нечего извлекать.

Достаточно ли безопасно UUID v4 для токенов сеанса?

Не сам по себе. V4 122 случайных битов непредсказуемы, но маркеры сеанса и аутентификации обычно требуют не менее 256 бит от криптографически безопасного генератора. Используйте специально созданный безопасный случайный токен для аутентификации и резервируйте UUID для идентификации ресурсов, а не для защиты их.

Как создать UUID?

Используйте встроенный генератор вашего языка: crypto.randomUUID() В современных браузерах и node.js, uuid.uuid4() в Python или Guid.NewGuid() В .NET каждый из них выдает V4 UUID за один вызов. Для быстрого разового или партия сгенерируйте их мгновенно с помощью Генератор UUID на Toolz.dev - код не требуется.

Сколько символов в UUID?

UUID состоит из 36 символов в его канонической форме текста: 32 шестнадцатеритические цифры плюс четыре дефиса, которые разделяют его на группы 8-4-4-4-12. Этот текст кодирует 128 бит, поэтому сохраняя его в виде 16 необработанных байтов с BINARY(16) гораздо компактнее, чем 36-символьная струна.


завершение

UUID - одна из тех основ, о которых вы не думаете ' не думайте, пока система не вырастет за пределы одной базы данных - а затем они 're все. Короткая версия 2026 года: по умолчанию V7 Для новых первичных ключей используйте v4 Когда вам нужны неопровержимые идентификаторы, сохраните их как родной uuid или BINARY(16), и пропустите v1 для чего-то нового. Учись у моего VARCHAR(36) днем, чтобы не повторить.

Сгенерируйте их мгновенно с помощью бесплатного Генератор UUID на Toolz.dev - одиночный или массовый, любая версия, все клиент-сторона с ничего не загружаемых Когда вам нужно прочитать время внутри v7, дотянуться до Конвертер времени отметки времени, и просмотреть остальные Инструменты кодирования- Более 600 бесплатных коммунальных услуг - более Toolz.dev, йо-

Frequently Asked Questions

A UUID uniquely identifies something — a database row, an API resource, a session, an uploaded file, a trace across microservices — without needing a central service to hand out IDs. It's the go-to whenever multiple systems or clients must create identifiers independently and still be sure they won't clash. You can generate one instantly with the UUID Generator on toolz.dev.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!