134 lines
6.5 KiB
Markdown
134 lines
6.5 KiB
Markdown
|
---
|
|||
|
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)
|