Руководство по GUID. Часть 2

Так каким же образом, GUID гарантированно является уникальным без централизованного контролирующего органа, аналогичного тому, что используется в системе ISBN?

Во-первых, обратите внимание на то, что количество возможных GUID-ов значительно больше количества номеров ISBN. Поскольку последняя цифра ISBN номера является контрольной суммой, то мы имеем всего лишь 1012 возможных значений. Это всего лишь по сотне уникальных ISBN номеров на каждого жителя Земли. Это значение практически равно 240, поэтому ISBN номер может быть представлен 40-разрядным значением (опять-таки, игнорируя контрольную сумму). Существует 2128 возможных GUID-ов; это по 40 триллионов уникальных GUID-ов на каждого жителя планеты. Только лишь это дает интуитивное понятие того, что гарантировать отсутствие коллизии будет довольно просто; существует огромное количество GUID-ов на выбор!

Существует несколько возможных стратегий обеспечения уникальности GUID-ов, и, на самом деле, информация об используемой стратегии закодирована в первых четырех битах третьей «группы»; практически любой GUID, с которыми вы столкнетесь, будет представлен в одном из двух видов: {xxxxxxxx-xxxx-1xxx-xxxx-xxxxxxxxxxxx} или {xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx}.

Если используется единица, то алгоритм обеспечения уникальности является, по сути, вариацией стратегии обеспечения уникальности номеров ISBN. Уникальность GUID-а гарантируется путем использования MAC-адреса сетевой карты в качестве одной из его частей. (Сложность обеспечения уникальности MAC-адресов двух сетевых карт в мире как-то решается кем-то другим; как именно, нам, в общем-то, не важно. Стоимость решения этой проблемы перекладывается на нас, покупателей, когда мы покупаем сетевую карту.)

(UPDATE: как указал Ларри Остерман (Larry Osterman), конечно же, решение на основе MAC-адреса не содержит защиты от дурака. Во-первых, вы можете намеренно или случайно сменить MAC-адрес на другой, который уже используется. Во-вторых, производитель оборудования вообще может забыть установить этот адрес, тогда вы получите адрес со всеми нулями. В-третьих, две виртуальные машины могут использовать одну физическую сетевую карту, и они могут генерировать GUID-ы в одно и то же время достаточно быстро, что может привести к коллизиям.)

Мы знаем, что можем использовать этот механизм для обеспечения уникальности в пространстве. Оставшаяся часть GUID-а является меткой времени с высоким разрешением. Таким образом, каждый сгенерированный GUID является уникальным как в пространстве, так и во времени, и, таким образом, он является глобально уникальным.

Однако на практике, эта система обладает несколькими слабыми сторонами. Самым очевидным недостатком является то, что эта система не работает без сетевого адаптера! Первые версии GUID-ов, сгенерированных на компьютерах без сетевого адаптера, не были гарантировано уникальными. Менее очевидным недостатком является то, что существует небольшой шанс того, что два GUID-а будут сгенерированы «одновременно». Возможно, два генератора GUID-ов были запущены одновременно на двух разных процессорах на одном компьютере в одно и то же время. Или был сгенерирован GUID, затем машинные часы были «переведены назад» и тот же самый GUID был сгенерирован снова, просто случайно. В GUID-е существует дополнительные секции, предназначенные для решения этих проблем, так что на практике они не проявляются.

Из этого алгоритма вытекает ряд интересных следствий. Во-первых, такие GUID-ы однозначно не случайны. Многие люди ошибочно полагают, что GUID-ы являются источниками недетерминированности, хотя на самом деле, они являются источниками гарантированной уникальности.

Во-вторых, GUID-ы, сгенерированные с помощью этого алгоритма, могут быть монотонно возрастающими на конкретном компьютере. На самом деле, это очень хорошее свойство; GUID-ы часто используются в качестве первичных ключей в базах данных, и вставка большого количества строк может быть значительно более эффективной, если строки уже отсортированы и вставка осуществляется после предыдущих записей. Опять-таки, это показывает, что использовать GUID-ы в качестве источника случайных 128-разрядных значений является ужасной идеей; случайные значения обычно не являются монотонно возрастающими!

В-третьих, код или документ, содержащий GUID, сгенерированный по первому алгоритму содержит информацию, уникально идентифицирующую компьютер, использованный для создания этого GUID . Как опытный читатель может получить интересные факты о книге по ISBN-номеру, так и другой опытный читатель может узнать когда и кем был сгенерирован GUID, если он содержит единицу в качестве тринадцатого шестнадцатеричного числа. Этот факт был использован для отслеживания и преследования автора известного вируса Melissa. (Следствия из этого мы рассмотрим более подробно в следующем эпизоде.)

В-четвертых, никакое подмножество разрядов GUID -а не обладает свойством глобальной уникальности, как указал на это Реймонд в далеком 2008-м. И правда, у нас нет повода ожидать, что меньший набор битов будет обладать теми же свойствами, что и больший набор битов! Вы же не ожидаете, что можно распилить самолет пополам и получить две летающие половинки.

В следующий раз мы обсудим GUID-ы, содержащие 4 в тринадцатой позиции шестнадцатеричного представления; они используют совершенно иную технику обеспечения уникальности.

Оригинал статьи