Что означает "последовательность часов"?
RFC 4122 (пространство имен URN универсального уникального идентификатора (UUID)) использует термин " тактовая последовательность ":
4.1.5. Последовательность часов
Для UUID версии 1 последовательность часов используется, чтобы помочь избежать дубликатов, которые могут возникнуть, когда часы установлены во времени назад или если ID узла изменяется.
Если часы установлены в обратном направлении или могли быть установлены в обратном направлении (например, когда система была отключена), и генератор UUID не может быть уверен, что не были сгенерированы UUID с временными метками, большими, чем значение, для которого были установлены часы, тогда последовательность часов должна быть изменена. Если известно предыдущее значение последовательности часов, его можно просто увеличить; в противном случае должно быть установлено случайное или высококачественное псевдослучайное значение.
Аналогичным образом, если идентификатор узла изменяется (например, из-за того, что сетевая карта была перемещена между машинами), установка случайной последовательности тактовой частоты минимизирует вероятность дублирования из-за небольших различий в настройках часов машин. Если бы значение тактовой последовательности, связанной с измененным идентификатором узла, было известно, то тактовая последовательность могла бы просто увеличиваться, но это маловероятно.
Тактовая последовательность ДОЛЖНА быть первоначально (то есть однажды за время существования системы) инициализирована случайным числом, чтобы минимизировать корреляцию между системами. Это обеспечивает максимальную защиту от идентификаторов узлов, которые могут быстро перемещаться или переключаться из системы в систему. Начальное значение НЕ ДОЛЖНО быть связано с идентификатором узла.
Для UUID версии 3 или 5 тактовая последовательность представляет собой 14-битное значение, созданное из имени, как описано в разделе 4.3.
Для версии 4 UUID тактовая последовательность представляет собой случайное или псевдослучайно сгенерированное 14-битное значение, как описано в разделе 4.4.
Что означает этот термин?
4 ответа
"Clock Sequence" кажется действительно вводящим в заблуждение названием. Основываясь на его определении, лучшим названием может быть "Случайный компонент uuid".
Одно из главных требований uuid к известности заключается в том, что если мы оба сгенерируем значение UUID, мы можем быть достаточно уверены, что не сгенерируем одинаковые 128-битные значения. Это говорит о вероятности столкновения.
Если бы у нас был общий координатор или заранее согласованная схема, мы также могли бы быть уверены, что столкновения у нас не будет.
Потенциальные схемы:
1. Partition Int Space: I get numbers 1-999, you get 1000-1999.
2. Request Reservation: Request 10 numbers and increment a centrally stored max reserved numbers. You get numbers 1-10. The next reservation gets 11-20.
Большое наблюдение UUID состоит в том, что, если у вас довольно много битов (16 в данном случае), маловероятно, что следующий запросчик получит такое же случайное значение.
Лотереи основаны на этой концепции.
Термин «тактовая последовательность» является неправильным.
Последовательность часов имеет одну другую цель:
Для UUID версии 1 последовательность часов используется, чтобы избежать дублирования, которое может возникнуть, когда часы переводятся назад во времени или если изменяется идентификатор узла.
В RFC-4122 говорится, что последовательность часов должна быть изменена, когда:
- часы идут назад;
- часы могли быть переведены назад;
- генератор не уверен, идут ли часы назад или нет;
- идентификатор узла изменился;
- идентификаторы узлов путаются.
Последовательность часов «может быть просто увеличена» (как последовательность). Но это МОЖЕТ, а не ДОЛЖЕН. Я нашел некоторые реализации, которые всегда рандомизируют последовательность часов здесь и здесь .
Я думаю, что слово «последовательность» является причиной путаницы. Хотя «тактовая последовательность» при увеличении ведет себя как последовательность, на самом деле это случайное число. Итак, UUID v1 имеет не просто две части, а именно время (100 нано григорианской эпохи) и место (адрес IEEE), а ТРИ: время, место и немного энтропии.
В этом выпуске Github вы можете найти обсуждение последовательности часов: https://github.com/uuid6/uuid6-ietf-draft/issues/41 .
https://pubs.opengroup.org/onlinepubs/9629399/apdxa.htm#tagcjh_20_02_01 рассказывает об алгоритме генерации последовательности часов.
Таким образом, это случайное число, сгенерированное при запуске программы. С каждым разом увеличивается
- Он обнаруживает, что местное время UTC идет назад
- Предыдущее время UTC не установлено из-за перезапуска приложения
Это одно из полей, которые составляют UUID, как определено в разделе 4.1.2.