Версии UUID и их валидация

UUID (Universally Unique Identifier) представляет собой 128-битный идентификатор, используемый для уникальной идентификации объектов в распределённых системах. Стандарт UUID описывает несколько версий, каждая из которых формируется по разным правилам и имеет собственные особенности генерации.

Структура UUID

Классический UUID представлен строкой формата:

xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

где:

  • x — шестнадцатеричный символ;
  • M — версия UUID;
  • N — вариант (variant), определяющий спецификацию.

Пример UUID:

550e8400-e29b-41d4-a716-446655440000

Ключевым элементом при валидации является именно версия, так как она определяет допустимые правила формирования строки.

Версии UUID

Существует несколько стандартизированных версий UUID:

UUID v1 — временной и MAC-адрес

UUID версии 1 формируется на основе:

  • текущего времени;
  • MAC-адреса устройства.

Особенности:

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

UUID v2 — DCE Security (редко используется)

UUID v2 применяется в контексте DCE (Distributed Computing Environment).

Особенности:

  • включает информацию о POSIX UID/GID;
  • практически не используется в современных приложениях;
  • поддержка ограничена.

UUID v3 — на основе MD5

UUID v3 формируется с использованием:

  • namespace;
  • имени (name);
  • хэширования MD5.

Особенности:

  • детерминированный результат (одинаковые входные данные → одинаковый UUID);
  • не зависит от времени;
  • используется для стабильной идентификации ресурсов.

UUID v4 — случайная генерация

UUID v4 является наиболее распространённым вариантом.

Особенности:

  • полностью случайная генерация;
  • высокая энтропия;
  • отсутствие привязки к устройству или времени;
  • используется в большинстве веб-приложений.

UUID v5 — на основе SHA-1

UUID v5 аналогичен v3, но использует SHA-1 вместо MD5.

Особенности:

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

Валидация UUID в Validator.js

Библиотека Validator.js предоставляет функцию:

isUUID(str [, version])

которая проверяет, соответствует ли строка формату UUID.

Базовая проверка

Простейший вариант использования:

const validator = require('validator');

validator.isUUID('550e8400-e29b-41d4-a716-446655440000');

Результат:

  • true — строка соответствует UUID любого допустимого формата.

Проверка конкретной версии

Validator.js позволяет указать версию UUID:

validator.isUUID('550e8400-e29b-41d4-a716-446655440000', 4);

Допустимые значения:

  • 1 — UUID v1
  • 3 — UUID v3
  • 4 — UUID v4
  • 5 — UUID v5
  • "all" — любая версия

Особенности проверки версий

UUID v1

Проверка v1 учитывает:

  • корректность временного сегмента;
  • допустимые значения варианта;
  • структуру MAC-основанного идентификатора.

Пример:

validator.isUUID('f47ac10b-58cc-11cf-a1a1-0242ac120002', 1);

UUID v3 и v5

Для v3 и v5 ключевым является формат, а не содержимое:

validator.isUUID('3b12f1df-5232-3a7c-8c3a-5b9d5b2c3a11', 3);
validator.isUUID('886313e1-3b8a-5372-9b90-0c9aee199e5d', 5);

Validator.js не проверяет корректность namespace или hash-источника, только структуру.


UUID v4

UUID v4 имеет строгую проверку случайной структуры:

validator.isUUID('3d813cbb-47fb-32ba-91df-831e1593ac29', 4);

Особенность:

  • определённые биты должны соответствовать спецификации версии 4;
  • нарушение структуры приводит к false.

Формат и регистрозависимость

UUID может содержать:

  • строчные буквы (a-f);
  • заглавные буквы (A-F);
  • цифры (0-9).

Validator.js не чувствителен к регистру:

validator.isUUID('550E8400-E29B-41D4-A716-446655440000', 4);

Результат будет корректным при соблюдении структуры.


Внутренняя логика проверки

Validator.js использует регулярные выражения, адаптированные под каждую версию UUID.

Общая логика включает:

  • проверку длины строки (36 символов с дефисами);
  • проверку позиций дефисов;
  • проверку версии (символ M);
  • проверку варианта (N).

Типичные ошибки при валидации UUID

Использование неправильной версии

UUID v4 часто ошибочно проверяется как v1 или наоборот:

validator.isUUID(uuid, 1); // false для v4

Отсутствие дефисов

UUID без дефисов не проходит валидацию:

550e8400e29b41d4a716446655440000

Результат:

  • false

Неверная длина

Любое отклонение от 36 символов автоматически делает строку невалидной.


Неправильный символ версии

В позиции версии допустимы только значения:

  • 1
  • 3
  • 4
  • 5

Любое другое значение приводит к ошибке валидации.


Практическое использование валидации UUID

Валидация UUID часто применяется в:

  • проверке идентификаторов пользователей;
  • контроле API-запросов;
  • фильтрации входных данных;
  • обеспечении целостности ссылок на ресурсы.

Пример проверки входного параметра:

function validateUserId(id) {
    if (!validator.isUUID(id, 4)) {
        throw new Error('Некорректный идентификатор пользователя');
    }
}

Комбинирование с другими методами Validator.js

UUID-валидация часто используется вместе с:

  • isEmpty — проверка пустых значений;
  • trim — очистка строки;
  • normalizeEmail — в системах с привязкой UUID к email.

Пример цепочки обработки:

const id = input.trim();

if (!validator.isUUID(id, 5)) {
    return false;
}

Сравнение строгой и общей проверки

validator.isUUID(str);       // любая версия
validator.isUUID(str, 'all'); // аналогично

и

validator.isUUID(str, 4);    // строго UUID v4

Строгая проверка применяется в системах, где важно различать источники генерации идентификаторов, тогда как общая используется при отсутствии требований к версии.


Поведение при некорректных входных данных

Validator.js приводит входные данные к строке, однако:

  • nullfalse
  • undefinedfalse
  • числа → проверяются как строки

Пример:

validator.isUUID(null); // false
validator.isUUID(123);  // false