digital-garden/knowledge/dev/UUID.md

134 lines
6.5 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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)