134 lines
6.5 KiB
Markdown
134 lines
6.5 KiB
Markdown
---
|
||
aliases:
|
||
tags:
|
||
- зрелость/🌱
|
||
date: 2023-11-12
|
||
zero-link:
|
||
- "[[../../garden/ru/meta/zero/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) |