Блог Wertigo

UUID: что это и зачем нужен

Синяя карточка с отпечатком пальца, соединённая с тремя цветными блоками данных с бирками, рядом отдельно лежит оранжевый ключ

Что такое UUID

UUID — это универсальный уникальный идентификатор, длинный номер, который программа присваивает объекту: заказу, файлу, записи в базе, диску или сеансу входа. Его главное свойство в том, что такой номер можно создать на любом компьютере без общего реестра и без проверки по списку уже выданных, и он всё равно не совпадёт с чужим.

Выглядит UUID так:

3f2b8c1e-9d4a-4c7b-a1e2-5f6d7c8b9a0e

Это 32 символа из цифр и букв от a до f, разделённые дефисами на пять групп: 8, 4, 4, 4 и 12 знаков. Всего с дефисами 36 символов. Обычный порядковый номер вроде «заказ 1045» выдаёт одна система по очереди. UUID нужен там, где номера создают одновременно многие устройства и серверы, а договориться между собой о следующем свободном числе они не могут.

Где встречается UUID

Чаще всего UUID работает незаметно, но иногда его приходится скопировать, найти или ввести вручную:

Где встретилсяЧто он обозначает
Адрес страницы, номер заказа или обращенияКонкретную запись в сервисе: документ, заказ, ссылку на файл
Токен для работы с Честным знаком Сеанс входа в систему маркировки. Система переходит на токены в формате UUID, прежний формат поддерживается до 31 декабря 2026 года
Сообщения и отчёты в электронном документообороте, 1СНомер конкретного сообщения или документа, по которому система ищет ответ
Диски и разделы в LinuxРаздел диска. По UUID система находит нужный раздел, даже если диск подключили в другой разъём
Настройки BIOS и сведения о компьютереСам компьютер. Номер записывает производитель, по нему компьютер различают программы учёта и лицензирования
MinecraftАккаунт игрока. Номер остаётся прежним, даже если игрок сменит ник

Сообщение вроде «в запросе отсутствует идентификатор» или «сообщение с указанным UUID не найдено» значит, что программа не нашла объект по этому номеру: идентификатор не передан, скопирован не полностью или относится к другой учётной записи. Сам формат UUID тут ни при чём, искать причину нужно в настройках программы или сервиса.

Из чего состоит запись

Внутри UUID — число длиной 128 бит, то есть 16 байт. В тексте его записывают шестнадцатеричными цифрами: каждый знак от 0 до f кодирует 4 бита. Поэтому других букв, кроме a–f, в UUID не бывает. Если в номере встретилась буква g или o, это опечатка.

Две позиции в записи служебные, по ним можно понять, как номер создан:

xxxxxxxx-xxxx-4xxx-axxx-xxxxxxxxxxxx

  • Первая цифра третьей группы — версия. В примере из начала статьи там стоит 4: это UUID версии 4, случайный. Цифра 7 на этом месте означает версию 7 и так далее.
  • Первый знак четвёртой группы — вариант. У современных UUID это 8, 9, a или b. Другие значения встречаются у очень старых идентификаторов и у особых номеров.

Остальные знаки зависят от версии: в одних это случайное число, в других время создания. Особый номер из одних нулей 00000000-0000-0000-0000-000000000000 называется нулевым UUID. Программы обычно используют его как «идентификатор не задан», поэтому в настоящей записи он чаще говорит об ошибке, чем о реальном объекте.

Версии UUID: чем отличаются v4 и v7

Действующий стандарт RFC 9562 вышел в 2024 году и заменил прежний RFC 4122. Он описывает восемь версий. На практике выбирают между тремя-четырьмя:

ВерсияЧто внутриКогда используют
v1, v6 Время создания и номер устройства: MAC-адрес сетевой карты или случайное число В старых системах. Для новых стандарт советует v7
v3, v5Хеш от имени: адреса сайта, ника, пути к файлу Когда из одного и того же имени всегда нужен один и тот же номер. v5 предпочтительнее v3
v4122 случайных битаСамый распространённый вариант по умолчанию: заказы, файлы, токены, тестовые данные
v7Время создания с точностью до миллисекунды и случайная частьКлючи записей в базах данных: новые номера идут по порядку, и базе проще их хранить и искать
v8Формат, который задаёт разработчикОсобые задачи, когда стандартные версии не подходят
v2Служебный формат старых систем безопасностиСейчас практически не встречается

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

UUID и GUID: есть ли разница

GUID — название того же 128-битного идентификатора в продуктах Microsoft: Windows, .NET, SQL Server. Стандарт прямо называет GUID другим именем UUID, поэтому в текстовом виде разницы нет. Отличия встречаются только в оформлении:

  • Windows часто показывает GUID в фигурных скобках и заглавными буквами: {3F2B8C1E-9D4A-4C7B-A1E2-5F6D7C8B9A0E}. Это тот же номер, что и 3f2b8c1e-9d4a-4c7b-a1e2-5f6d7c8b9a0e.
  • В двоичном виде некоторые программы Microsoft хранят первые три группы байтов в обратном порядке. Это важно, только если вы переносите идентификаторы между базами данных побайтно, а не текстом.

Слово GUID встречается и в разметке дисков: GPT расшифровывается как GUID Partition Table. Каждый раздел такого диска получает свой GUID, отсюда и название.

Может ли UUID совпасть

Теоретически может, на практике шанс ничтожен. У UUID v4 случайная часть даёт около 5×1036 вариантов. Чтобы вероятность хотя бы одного совпадения достигла одного шанса на миллиард, нужно создать примерно 103 триллиона идентификаторов. Если выпускать миллиард UUID в секунду, шанс встретить одну пару станет «пятьдесят на пятьдесят» лишь через 86 лет. Растёт он так быстро из-за того же эффекта, что и в парадоксе дней рождения, но даже с ним числа остаются огромными.

Когда UUID всё-таки повторяются, виновата почти всегда ошибка, а не случайность:

  • номер скопировали из примера, документации или тестовых данных вместо того, чтобы создать новый;
  • программа создаёт номера простым генератором случайных чисел, который после перезапуска выдаёт ту же последовательность;
  • v1 создавали на виртуальных машинах, склонированных из одного образа, с одинаковым номером устройства.

Поэтому в базах данных уникальность всё равно проверяют ограничением UNIQUE или первичным ключом. Стандарт тоже советует заранее оценить, чем обернётся совпадение: повтор в журнале событий почти безвреден, а в платёжной записи — нет.

Можно ли использовать UUID как пароль или секретную ссылку

Нельзя полагаться на то, что UUID невозможно угадать. Стандарт прямо говорит, что UUID не стоит считать трудноугадываемыми и нельзя давать доступ только за то, что человек знает номер. Причины разные:

  • v1, v6 и v7 содержат время создания: соседние номера похожи, и их легче подобрать;
  • v3 и v5 вычисляются из имени: зная имя, номер получит кто угодно;
  • v4 надёжен лишь настолько, насколько надёжен генератор случайных чисел в конкретной программе, а снаружи этого не проверить.

При этом сервисы иногда выдают случайный UUID как токен входа, так делает и Честный знак. Это работает, потому что токен создаёт сам сервер, он действует ограниченное время и привязан к сеансу. Обращайтесь с таким токеном как с паролем: не пересылайте его и не публикуйте в скриншотах.

Если нужен секрет, который вы будете хранить и вводить сами, используйте пароль. Его можно создать в генераторе паролей, а о длине и составе подробно рассказано в статье «Как придумать надёжный пароль».

Как узнать UUID компьютера и диска

Что ищемКак посмотреть
UUID компьютера в WindowsВ PowerShell: Get-CimInstance Win32_ComputerSystemProduct | Select-Object UUID
UUID компьютера в Linuxsudo cat /sys/class/dmi/id/product_uuid
UUID MacУдерживая Option, откройте меню Apple → «Информация о системе», строка «UUID оборудования»
UUID разделов диска в Linuxlsblk -f или sudo blkid

UUID компьютера записан производителем в таблицы SMBIOS и не меняется при переустановке системы. У дешёвых материнских плат и самосборных компьютеров он иногда бывает пустым или одинаковым у целой партии: тогда программа, которая отличает компьютеры по UUID, может принять два устройства за одно.

У разделов в Linux может быть два номера. UUID принадлежит файловой системе, его чаще всего указывают в /etc/fstab, чтобы раздел подключался при загрузке. PARTUUID принадлежит самому разделу в таблице GPT. После форматирования раздела UUID файловой системы меняется, поэтому старая строка в /etc/fstab перестаёт работать, и номер нужно обновить.

Как создать UUID

Для одного номера или списка не нужно ничего устанавливать: сгенерируйте UUID v4 онлайн, а затем скопируйте список или скачайте его файлом TXT. В программах и скриптах UUID создают встроенными средствами:

ГдеUUID v4UUID v7
JavaScript в браузере и Node.jscrypto.randomUUID()Нет встроенной функции
Pythonuuid.uuid4()uuid.uuid7(), с версии 3.14
PostgreSQLgen_random_uuid()uuidv7(), с версии 18
Терминал Linuxuuidgenuuidgen --time-v7, в свежих версиях util-linux
Терминал macOSuuidgenНет встроенной команды
PowerShell в WindowsNew-Guid[guid]::CreateVersion7(), в PowerShell 7.5 и новее

В браузере crypto.randomUUID() работает только на страницах, открытых по HTTPS или с локального адреса. В базе данных храните UUID в специальном типе uuid, а не текстом: так номер занимает 16 байт вместо 36 символов, и стандарт рекомендует именно такое хранение.

Частые вопросы

Можно ли записывать UUID без дефисов или заглавными буквами?

Это тот же номер: регистр букв по стандарту значения не имеет, а дефисы только разделяют группы. Но конкретная программа может принимать лишь одну запись, обычно строчными буквами с дефисами. Если номер не принимается, приведите его к этому виду и уберите фигурные скобки.

Почему скопированный UUID не принимается, хотя выглядит правильно?

Частые причины: при копировании пропал символ или попал пробел, перенос строки, кавычка. Ещё одна ловушка — русские буквы «а», «с» или «е» вместо латинских a, c и e: на вид они не отличаются. Проверьте длину, должно быть 36 символов с дефисами, и найдите русские буквы в строке.

Что такое UUID в Minecraft?

Это постоянный номер аккаунта Java Edition. Он создаётся при регистрации и не меняется при смене ника, поэтому серверы хранят по нему права и прогресс игрока. На серверах без проверки лицензии UUID вычисляется из ника, и после смены ника игрок получает новый номер. Генератор случайных UUID не подходит: он создаёт новые номера, а не находит существующий.

Рекомендуем