Exploring PostgreSQL 18's new UUIDv7 support 🔥 Горячее 💬 Длинная дискуссия
PostgreSQL 18 представляет поддержку UUIDv7, нового типа универсально уникальных идентификаторов, решающего проблемы производительности традиционных UUIDv4. В отличие от полностью случайного UUIDv4, UUIDv7 включает временную метку как наиболее значимую часть своей 128-битной структуры, обеспечивая естественную сортировку по времени создания. Это открывает возможности для более эффективного использования UUID в качестве первичных ключей в базах данных.
В статье демонстрируется сравнительный анализ производительности между UUIDv4 и UUIDv7 через создание двух таблиц для "магазина крабов" с использованием Aiven for PostgreSQL. Авторы предоставляют практические примеры кода для создания сервиса и таблиц, а также функцию для вставки случайных данных. Тесты показывают, что UUIDv7 может значительно улучшить производительность операций вставки по сравнению с UUIDv4, особенно при работе с большими объемами данных.
Комментарии (196)
- UUIDv7 раскрывает время создания записи, что может быть критично для приватности и безопасности, особенно если первичный ключ публично доступен.
- Эксперты рекомендуют использовать UUIDv7 только для внутренних ключей и выставлять отдельный UUIDv4 как публичный идентификатор.
- Но в большинстве случаев, когда выбор между UUIDv7 и v4, важно учитывать, что v7 предоставляет лучшую производительность при вставке и сортировке, но требует дополнительных усилий для защиты приватности.
UUIDv47: Store UUIDv7 in DB, emit UUIDv4 outside (SipHash-masked timestamp)
UUIDv47: приватность v4 + производительность v7
Навигационное меню
Платформа:
- GitHub Copilot
- GitHub Spark
- GitHub Models
- GitHub Advanced Security
- Actions
- Codespaces
- Issues
- Code Review
- Discussions
- Code Search
Ресурсы:
- AI
- DevOps
- Security
- Software Development
Open Source:
- GitHub Sponsors
- The ReadME Project
- Topics
- Trending
- Collections
Enterprise:
- Enterprise platform
- GitHub Advanced Security
- Copilot for business
- Premium Support
Поиск кода, репозиториев, пользователей, проблем, pull requests...
Включите мой email для связи
Отмена Отправить отзыв
Сохраненные поиски для быстрой фильтрации результатов
Имя Запрос
Отмена Создать сохраненный поиск
Войти Зарегистрироваться
Комментарии (69)
- Предложены методы маскирования UUIDv7 для скрытия временных меток при внешнем использовании, сохраняя их внутренние преимущества (сортировка, индексация).
- Обсуждается использование шифрования (Speck, AES) или хеширования (SipHash) для обратимой конвертации между внутренним UUIDv7 и внешним UUIDv4-видным идентификатором.
- Рассмотрены альтернативные подходы: разделение на внутренний и внешний ключ, использование ULID, Sqids (ранее Hashids) или кастомного кодирования.
- Подняты вопросы о практической необходимости скрытия временных меток и рисках (безопасность, корреляция данных для деанонимизации).
- Отмечены проблемы совместимости, сложности реализации и потери некоторых преимуществ UUIDv7 для потребителей API.
- Затронуты технические аспекты: генерация на клиенте, визуальное сравнение UUID, необходимость отдельного поля с временем для клиента.
- Упомянуты связанные проекты и алгоритмы: uuidv47, ULID, Speck, метод из blog.notdot.net.
Guid Smash
Вероятность совпадения двух GUID — 1 к 2¹²², то есть примерно 1 к 5×10³⁶.
Guid Smash показывает, насколько близко каждый новый GUID подходит к целевому.
- Целевой GUID: 6e197264-d14b-44df-af98-39aac5681791
- Старт: 20 июля 2025
- Проверено: 1,14 трлн GUID
- Скорость: ~468 тыс./с
- Ожидаемое совпадение: через 4,21×10²³ лет при 400 тыс./с
| Префикс | Совпадений |
|---|---|
| 6 | 66,7 млрд |
| 6e | 4,17 млрд |
| 6e1 | 261 млн |
| 6e19 | 16,3 млн |
| 6e197 | 1,02 млн |
| 6e1972 | 63,7 тыс |
| 6e19726 | 4,0 тыс |
| 6e197264 | 244 |
| 6e197264d | 11 |
| 6e197264d1…1791 | 0 |
Ошибка. Перезагрузить
Комментарии (61)
- Вероятность совпадения двух случайных UUIDv4 действительно 1 : 2¹²², но из-за парадокса дней рождения при генерации ≈ 2⁶¹ идентификаторов шанс хотя бы одного дубля возрастает до ~50 %.
- Эксперимент лучше вести не «в лоб» (ищем конкретный UUID), а проверяя все уже сгенерированные значения на дубликаты.
- UUIDv7 снабжены 48-битным префиксом времени: при генерации миллионов ID в одну миллисекунду коллизии становятся реальнее.
- На практике коллизии встречаются: участники сообщили два случая — один из-за одинакового «магического» GUID, другой при слиянии данных разных систем.
- Для коротких уникальных кодов подстрока UUID не подходит; нужно учитывать «день рождения» и выбирать диапазон квадратично больше требуемого количества.