--- aliases: tags: - зрелость/🌱 date: 2023-11-12 zero-link: - "[[00 Разработка]]" parents: linked: --- Universal Unique IDentifier (UUID). RFC-4122. Представляет собой 128 bit строку. Но заполнить можно только 122 бита, так как 6 bit зарезервировано: - 4 бита под версию uuid - 2 бита под variant ![](Pasted%20image%2020231112132644.png) Как именно заполняются 122 бита регламентирует версия UUID: - 2 специальный UUID - Nil UUID. Все 0. - Max UUID. Все f. - 5 стандартных версии (RFC 4122) - 3 новые версии ## UUID V1 ^v1 ![](Pasted%20image%2020231112133236.png) - Используется григорианское время. Сортировать нельзя, так как время записано наоборот. - Рандомная компонента - Node ID привязан к железу. Необходимо подменять на фейковое значение. **Минусы:** - Не сортируемый. **Плюсы:** - Константное время вставки в БД. - Перебрать сложно. - Можно извлечь метку времени. ## UUID V3 ^v3 ![](Pasted%20image%2020231112133916.png) - Устарел, лучше использовать UUID v5. ## UUID V4 ^v4 ![](Pasted%20image%2020231112133824.png) - Все биты рандомные **Минусы:** - Время вставки растет. Чем больше записей существует, тем дольше вставка. - Не сортируемый - Не хранит дополнительной информации **Плюсы:** - Невозможно перебрать ## UUID V5 ^v5 ![](Pasted%20image%2020231112134012.png) - Такой же, как и V3, но использует SHA1, вместо MD5. **Минусы:** - Время вставки растет. Чем больше записей существует, тем дольше вставка. - Не сортируемый - Не хранит дополнительной информации. **Плюсы:** - Сложно перебрать ## UUID V6 ^v6 ![](Pasted%20image%2020231112133512.png) Исправляет проблему UUID v1 и делает его сортируемым, изменяя порядок записи времени. ## UUID V7 ^v7 ![](Pasted%20image%2020231112133651.png) - Используется Unix время, вместо григорианского. - Unix занимает меньше места, чем григорианское - Остальная часть рандомная **Плюсы:** - Константное время вставки в БД. - Сортируемый. - Сложно перебрать. - Можно извлечь метку времени. 1. **Тип 1 (по умолчанию)**: - `UuidCreator.getTimeOrderedEpoch();` - twice as fast as `UUID.randomUUID()` - **Плюсы**: Предоставляет хороший баланс между уникальностью и последовательностью. Подходит для ситуаций, где важен порядок элементов. - **Минусы**: Более низкий уровень случайности по сравнению с Типами 2 и 3, что может быть менее предпочтительным для сценариев, требующих высокой уникальности. - Максимально возможная последовательность 2. **Тип 2 (плюс 1)**: - `UuidCreator.getTimeOrderedEpochPlus1();` - 20x faster than `UUID.randomUUID()` - **Плюсы**: Обеспечивает более высокий уровень уникальности и последовательности за счет монотонного увеличения. Подходит для создания уникальных сущностей с сохранением порядка. - **Минусы**: Менее случаен, чем Тип 3, что может быть недостаточным для очень высоких требований к уникальности. 3. **Тип 3 (плюс n)**: - `UuidCreator.getTimeOrderedEpochPlusN()`; - twice as fast as `UUID.randomUUID()` - **Плюсы**: Максимальная уникальность за счет случайного увеличения. Подходит для сценариев, где требуется высокая уникальность без строгих требований к последовательности. - **Минусы**: Меньшая предсказуемость и последовательность по сравнению с Типами 1 и 2, что может быть проблемой в некоторых приложениях. - Максимальная уникальность без строгих требований к последовательности. ## Автоинкремент - Нужно место, где мы будем хранить последнее состояние **Плюсы:** - Сортируемый - Легко читаемый и запоминаемый **Минусы:** - Легко перебрать и получить все записи. А также можно прикидывать статистику: сколько заказов было, количество за неделю. - Имеет конечный диапазон значений - Не хранит дополнительную информацию ### Преобразование автоинкремента в UUID ![](Pasted%20image%2020231112135724.png) ## Производительность Генерируем по 200000 идентификаторов в цикле, после чего вставляем эти данные. ![](Pasted%20image%2020231112141139.png) Массовое чтение, через IN ![](Pasted%20image%2020231112141352.png) ![](Pasted%20image%2020231112141530.png) ## Дополнительные материалы - [ID-баттл: UUID vs автоинкремент / Валентин Удальцов - YouTube](https://www.youtube.com/watch?v=Xr_SNd9LIng&t=1762s) - [Библиотека для генерации UUID в Java. Все версии](https://github.com/f4b6a3/uuid-creator)