digital-garden/knowledge/dev/UUID.md
2024-06-13 21:01:37 +03:00

6.5 KiB
Raw Blame History

aliases tags date zero-link parents linked
зрелость/🌱
2023-11-12
00 Разработка

Universal Unique IDentifier (UUID). RFC-4122.

Представляет собой 128 bit строку. Но заполнить можно только 122 бита, так как 6 bit зарезервировано:

  • 4 бита под версию uuid
  • 2 бита под variant

Как именно заполняются 122 бита регламентирует версия UUID:

  • 2 специальный UUID
    • Nil UUID. Все 0.
    • Max UUID. Все f.
  • 5 стандартных версии (RFC 4122)
  • 3 новые версии

UUID V1

^v1

  • Используется григорианское время. Сортировать нельзя, так как время записано наоборот.
  • Рандомная компонента
  • Node ID привязан к железу. Необходимо подменять на фейковое значение.

Минусы:

  • Не сортируемый.

Плюсы:

  • Константное время вставки в БД.
  • Перебрать сложно.
  • Можно извлечь метку времени.

UUID V3

^v3

  • Устарел, лучше использовать UUID v5.

UUID V4

^v4

  • Все биты рандомные

Минусы:

  • Время вставки растет. Чем больше записей существует, тем дольше вставка.
  • Не сортируемый
  • Не хранит дополнительной информации

Плюсы:

  • Невозможно перебрать

UUID V5

^v5

  • Такой же, как и V3, но использует SHA1, вместо MD5.

Минусы:

  • Время вставки растет. Чем больше записей существует, тем дольше вставка.
  • Не сортируемый
  • Не хранит дополнительной информации.

Плюсы:

  • Сложно перебрать

UUID V6

^v6

Исправляет проблему UUID v1 и делает его сортируемым, изменяя порядок записи времени.

UUID V7

^v7

  • Используется 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

Производительность

Генерируем по 200000 идентификаторов в цикле, после чего вставляем эти данные.

Массовое чтение, через IN

Дополнительные материалы