Что такое UUID в Python
Импортируйте модуль uuid — и на любой поддерживаемой версии Python доступны четыре генератора: uuid4() (случайный, обычный выбор для первичного ключа), uuid1() (время плюс адрес узла машины: может выдать MAC-адрес и раскрывает момент создания) и детерминированная пара uuid3() и uuid5(), вычисляющая хэш пространства имён и имени по MD5 или SHA-1.
В Python 3.14 добавились версии RFC 9562: uuid6(), uuid7() и uuid8(), а также константы uuid.NIL и uuid.MAX и параметр --count у командной строки модуля. Для новых таблиц чаще всего нужен v7: он содержит 48-битную метку времени Unix в миллисекундах и счётчик, поэтому значения сортируются по порядку создания, а вставки не разбрасываются по индексу. На более старой версии ту же роль играет пакет uuid6 или uuid-utils.
Как использовать
- Импортируйте модуль и вызовите
uuid.uuid4()— для большинства задач этого достаточно. - В Python 3.14+ используйте
uuid.uuid7(), если значения попадут в индексируемый столбец. - Используйте
uuid.uuid5(namespace, name), когда одинаковый вход должен давать одинаковый UUID на любой машине.
Сценарии
- Первичные ключи: v4 для случайных, v7 для больших таблиц, где важен порядок вставки.
- Идемпотентные конвейеры: v5 из URL или бизнес-ключа делает повторный запуск воспроизводимым.
- Тестовые данные: детерминированные идентификаторы сохраняют стабильность проверок.
Сравнение UUID в Python с другими форматами
| Вариант | Когда использовать |
|---|---|
uuid4() | Случайный, 122 бита энтропии. Выбор по умолчанию. |
uuid7() | Упорядочен по времени, RFC 9562. Python 3.14 и новее. |
uuid1() | Время плюс node. Раскрывает адрес оборудования; избегайте в новом коде. |
uuid5() | Детерминированный SHA-1 от пространства имён и имени. Воспроизводим везде. |
Примеры кода
Случайный (любая версия)
import uuid
print(uuid.uuid4()) # 550e8400-e29b-41d4-a716-446655440000
print(str(uuid.uuid4()), uuid.uuid4().hex, sep='\n')
# Список идентификаторов для массовой вставки
ids = [str(uuid.uuid4()) for _ in range(1000)]
Упорядоченный (Python 3.14+)
import uuid
print(uuid.uuid7()) # 019535d9-3df7-79fb-b466-fa907fa17f9e
print(uuid.uuid6()) # переставленный v1
print(uuid.NIL, uuid.MAX) # константы nil и max
Детерминированный из имени
import uuid
# Одна и та же пара всегда даёт один UUID на любой машине
uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com')
uuid.uuid5(uuid.NAMESPACE_URL, 'https://example.com/page')
# uuid3() — устаревший вариант на основе MD5
Командная строка
# Python 3.12+: модуль запускается напрямую
python -m uuid
# Python 3.14+: можно выбрать версию и количество
python -m uuid -u uuid7 -C 5
Частые вопросы
Какую функцию uuid выбрать?
Для случайных идентификаторов — uuid4(), для индексируемых столбцов и сортировки по времени создания — uuid7(). От uuid1() в новом коде лучше отказаться: он раскрывает адрес узла и время создания значения.
Безопасен ли uuid4() для секретов?
Он создаётся системным CSPRNG, так что случайность надёжная, но UUID — не секрет: в нём нет аутентификации, а угадать его крайне сложно, но не невозможно. Никогда не используйте UUID как пароль, токен или мандат доступа.
Как получить UUID v7 в Python 3.13 и старше?
Стандартная библиотека получила uuid6/7/8 только в 3.14. На более старых версиях установите пакет uuid6 (uuid6.uuid7()) или uuid-utils, либо соберите v7 из time.time_ns() и os.urandom(), если зависимость недопустима.