digital-garden/knowledge/dev/UUID.md

134 lines
6.5 KiB
Markdown
Raw Normal View History

2024-06-13 21:01:37 +03:00
---
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)