Ой, ничего не найдено!

К сожалению, по вашему запросу пока ничего нет (но это только пока!), зато вы можете подписаться на нашу замечательную email-рассылку, чтобы не пропустить самое интересное в будущем.

  • 74

Что такое UUID и как это можно испльзовать в проекте на Laravel

  • 3 минуты на чтение

Обзор UUID

UUID (Universally Unique Identifier) — это универсальный уникальный идентификатор длиной 128 бит, применяемый для однозначной идентификации информации в распределённых системах. Самый распространённый способ записи — строка из 36 символов, включающая 32 шестнадцатеричных числа и 4 дефиса, например:

123e4567-e89b-12d3-a456-426614174000

UUID создаются таким образом, что вероятность столкновения (совпадения) идентификаторов чрезвычайно мала, поэтому их удобно использовать там, где необходимо гарантировать глобальную уникальность без единого центра генерации.

Структура UUID

UUID имеет длину 128 бит. При представлении в виде стандартной (канонической) строковой формы разбивается на 5 групп шестнадцатеричных чисел, разделённых дефисами:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Например:

f81d4fae-7dec-11d0-a765-00a0c91e6bf6
  • Группа 1: 8 шестнадцатеричных цифр
  • Группа 2: 4 шестнадцатеричные цифры
  • Группа 3: 4 шестнадцатеричные цифры
  • Группа 4: 4 шестнадцатеричные цифры
  • Группа 5: 12 шестнадцатеричных цифр

Версии UUID

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

  1. Версия 1 (time-based)
    Основана на временном штампе и MAC-адресе устройства, с которого генерируется UUID. Может нести в себе некоторую информацию о машине и времени.

  2. Версия 2 (DCE Security)
    Менее распространённая в современных приложениях; тоже основана на времени, но дополнительно включает идентификаторы пользователя или группы.

  3. Версия 3 (name-based, MD5)
    Генерируется путём хеширования (MD5) имени и пространства имён (namespace).

  4. Версия 4 (random)
    Генерируется случайным образом с использованием криптографически стойкого ГСЧ (генератора случайных чисел). Это самый часто используемый вид UUID, так как не содержит «утекающей» информации — только случайность.

  5. Версия 5 (name-based, SHA-1)
    Аналогична версии 3, но использует SHA-1 вместо MD5.

Основные сферы применения

  • Первичные ключи (Primary Keys) в БД
    Многие предпочитают использовать UUID вместо автоинкрементных полей, особенно в распределённых базах данных.
  • Идентификаторы ресурсов
    Например, в URLs, конфигурационных файлах и метаданных, где важно обеспечить глобальную уникальность.
  • Распределённые системы
    UUID часто применяют для идентификации сообщений, корреляции запросов, ссылок между сервисами.

Генерация UUID в Python (пример на всякий случай)

В стандартной библиотеке Python есть модуль uuid, который умеет генерировать UUID разных версий:

import uuid

# Версия 1
uuid1 = uuid.uuid1()
print("UUID1:", uuid1)

# Версия 3 (на основе MD5)
uuid3 = uuid.uuid3(uuid.NAMESPACE_DNS, 'example.com')
print("UUID3:", uuid3)

# Версия 4 (случайный)
uuid4 = uuid.uuid4()
print("UUID4:", uuid4)

# Версия 5 (на основе SHA-1)
uuid5 = uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com')
print("UUID5:", uuid5)
Бесплатный хостинг на 6 месяцев для новых пользователей!
Примените промокод FREE6MONTH и получите высокоскоростной хостинг без оплаты.

Пример результата:

UUID1: 1a6fce5a-cd67-11eb-b8bc-0242ac130003
UUID3: 5df41881-3aed-3515-88a7-2f4a814cf09e
UUID4: 9180fdef-6640-4c7a-8334-958a27551c16
UUID5: 2ed6657d-e927-568b-95e1-2665a8aea6a2

Практические аспекты

  1. Уникальность

    • Версия 4 UUID практически не сталкивается с коллизиями (количество возможных значений (2^{128}) очень велико).
    • Версия 1 включает в себя MAC-адрес и временной штамп, что тоже надёжно в плане уникальности.
  2. Конфиденциальность

    • Версия 1 может «выдавать» некоторую информацию об устройстве (MAC-адрес) и времени генерации. Для большей приватности чаще используют версию 4.
  3. Индексация

    • В больших таблицах БД UUID как индекс может работать медленнее, чем автоинкрементные ключи. Если важна сортировка или производительность индексов, есть альтернативы (например, ULID, Time-Ordered UUID и т. д.).
  4. Удобочитаемость

    • UUID длинные и не слишком удобны для восприятия человеком. Если нужны более короткие/«говорящие» идентификаторы, можно использовать другие решения.

ULID (Альтернатива UUID)

ULID (Universally Unique Lexicographically Sortable Identifier) — это тоже 128-битный идентификатор, но представленный в base32. Он сочетает сортируемую по времени часть и случайную часть:

  • Легко сортируется (сначала идёт временной компонент).
  • Более короткая форма записи (01AN4Z07BY...).
  • Гарантирует уникальность и упорядоченность.

ULID может стать хорошим выбором, если важно сохранять порядок и при этом иметь уникальные идентификаторы.

Использование UUID в Laravel (примерно версия 12, но актуально и для 8/9/10)

В Laravel есть несколько способов использовать UUID как первичный ключ в моделях Eloquent. Ниже — один из распространённых вариантов.

1. Настройка модели для UUID

Допустим, у нас есть таблица users, в которой мы хотим использовать поле id типа uuid как первичный ключ.

  • Создаём (или правим) миграцию так, чтобы поле id было типом uuid:
// Пример миграции
Schema::create('users', function (Blueprint $table) {
    $table->uuid('id')->primary();
    // Остальные поля...
    $table->string('name');
    $table->timestamps();
});
  • В модели User указываем, что:
    1. Ключ не автоинкрементный.
    2. Тип ключа — string.
    3. При создании новой записи нам нужно генерировать UUID автоматически.
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class User extends Model
{
    // Отключаем автоинкремент
    public $incrementing = false;

    // Указываем, что тип ключа — string
    protected $keyType = 'string';

    // Если вы хотите, чтобы Laravel не добавлял "id" при массовом заполнении
    // (необязательно, зависит от конфигурации)
    protected $guarded = [];

    /**
     * Хук Eloquent, вызываемый при создании новой модели
     */
    protected static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            if (empty($model->{$model->getKeyName()})) {
                // Генерируем UUID (версия 4)
                $model->{$model->getKeyName()} = (string) Str::uuid();
            }
        });
    }
}

Теперь при создании нового пользователя:

$user = User::create([
    'name' => 'Ivan Petrov',
    // Поле 'id' не указываем явно, оно заполнится автоматически
]);

dd($user->id); // Будет что-то вроде "ab12464d-3a10-4c1b-ae98-b4478b177070"
Бесплатный хостинг на 6 месяцев для новых пользователей!
Примените промокод FREE6MONTH и получите высокоскоростной хостинг без оплаты.

2. Генерация UUID при других событиях

Иногда удобнее использовать события на уровне Model Observer или пакет вроде ramsey/uuid, но в свежих версиях Laravel вполне достаточно стандартного Str::uuid().

3. Маршрутизация и поиск записей по UUID

Чтобы удобно находить пользователей (или другие модели) по UUID, можно настроить Route Model Binding:

// web.php
use App\Models\User;

Route::get('/users/{user}', function (User $user) {
    return $user;
});

Laravel сам определит, что в {user} должен быть UUID (если это указано в БД как PK). Если хотите жёстко ограничить шаблон URL, используйте регулярку:

Route::get('/users/{user}', function (User $user) {
    return $user;
})->where('user', '[0-9a-fA-F-]{36}');

4. Преимущества и недостатки использования UUID в Laravel

Плюсы:

  • Уникальность без централизованного счётчика (автоинкремента).
  • Безопасность: сложнее угадать количество записей в БД (в отличие от стандартных 1, 2, 3, ...).
  • Удобство в распределённых системах.

Минусы:

  • UUID крупнее, чем целое число (по памяти и по скорости сравнения).
  • Индексация полей с UUID может быть чуть медленнее, чем у автоинкремента.
  • Сложнее «на глаз» оценить порядок записей (если не использовать сортируемые варианты).

Резюме

  • UUID — стандартный способ генерировать уникальные 128-битные идентификаторы.
  • Версия 4 (случайная) обычно предпочтительнее, так как не раскрывает «внутреннюю» информацию.
  • В Laravel удобно использовать UUID в качестве первичного ключа в моделях:
    • Настраиваем поле типа uuid в миграции.
    • Выключаем автоинкремент и указываем $keyType = 'string' в модели.
    • Генерируем UUID автоматически (например, через хук creating).
  • Для удобства поиска по UUID можно настроить Route Model Binding.
  • Если нужно, чтобы идентификаторы были отсортированы по времени, подумайте о ULID или Time-Ordered UUID.

Таким образом, использование UUID в Laravel даёт гибкость и уникальность идентификаторов, что особенно полезно в распределённых системах или когда требуется дополнительная безопасность от угадывания ID.

Специальное предложение: бесплатный хостинг на полгода!
Введите промокод FREE6MONTH при регистрации и наслаждайтесь надежным хостингом бесплатно.

Хостинг, на который можно положиться!
Siteko.net

Устали от медленного хостинга или дорогих тарифов? Тогда вам к нам! Siteko.net — это быстрый и простой хостинг для тех, кто ценит удобство и стабильность.

  • Без падений и нервов — наш uptime почти всегда 100%.
  • Гибкие тарифы — только нужные функции, ничего лишнего.
  • Скорость— сайты грузятся, как пуля!
  • Удобно — разобраться сможет даже новичок, всё под рукой.
  • Поддержка всегда рядом 24/7 поможем решить любой вопрос.

Заходите на Siteko.net и попробуйте нас бесплатно первый месяц! Мы делаем всё, чтобы ваш сайт работал без проблем.

Siteko.net — просто, быстро и надёжно!