Руководство по UUID в Java

Руководство по UUID в Java

1. обзор

UUID (универсальный уникальный идентификатор), также известный как GUID (глобальный уникальный идентификатор), представляетa 128-bit long value that is unique for all practical purposes. Стандартное представление UUID использует шестнадцатеричные цифры (октеты):

123e4567-e89b-12d3-a456-556642440000

UUID состоит из шестнадцатеричных цифр (по 4 символа) и 4 символов «-», составляющихlength equal to 36 characters.

Нулевой UUID - это особая форма UUID, в которой все биты установлены в ноль.

В этой статье мы рассмотрим классUUID в Java.

Дальнейшее чтение:

CharSequence vs. Строка в Java

Узнайте разницу между CharSequence и String.

Read more

Use char[ Массив поверх строки для манипулирования паролями в Java?]

Изучите несколько причин, по которым мы не должны использовать строки для хранения паролей, а вместо этого использовать массивы char [].

Read more

Руководство по Java String Pool

Узнайте, как JVM оптимизирует объем памяти, выделяемой для хранения строк в пуле строк Java.

Read more

2. Состав

Возьмем пример UUID:

123e4567-e89b-42d3-a456-556642440000
xxxxxxxx-xxxx-Bxxx-Axxx-xxxxxxxxxxxx

A представляет собой вариант, который определяет структуру UUID. Все остальные биты в UUID зависят от установки битов в поле варианта. Вариант определяется по 3 старшим значащим битам A:

  MSB1    MSB2    MSB3
   0       X       X     reserved (0)
   1       0       X     current variant (2)
   1       1       0     reserved for Microsoft (6)
   1       1       1     reserved for future (7)

ЗначениеA в упомянутом UUID - «a». Бинарный эквивалент ‘a '(= 10xx) показывает вариант как 2. B представляет версию. Версия в упомянутом UUID (значениеB) - 4.

Java предоставляет методы для получения варианта и версии UUID: __

UUID uuid = UUID.randomUUID();
int variant = uuid.variant();
int version = uuid.version();

Это 5 разных версий для варианта 2 UUID: на основе времени (UUIDv1), безопасности DCE (UUIDv2), на основе имени (UUIDv3 и UUIDv5), случайный (UUIDv4).

Java предоставляет реализацию для v3 и v4, но также предоставляетconstructor для генерации любого типа UUID:

UUID uuid = new UUID(long mostSigBits, long leastSigBits);

2.1. Версия 3 и 5

UUID генерируются с использованием хэша пространства имен и имени. Идентификаторы пространства имен - это UUID, такие как система доменных имен (DNS), идентификаторы объектов (OID), URL-адреса и т. Д.

UUID = hash(NAMESPACE_IDENTIFIER + NAME)

Единственное различие между UUIDv3 и UUIDv5 заключается в алгоритме хеширования - v3 использует MD5 (128 бит), а v5 использует SHA-1 (160 бит).

Проще говоря, мы усекаем результирующий хеш до 128 бит, а затем заменяем 4 бита для версии и 2 бита для варианта.

Давайте сгенерируем UUID типа 3:

String source = namespace + name;
byte[] bytes = source.getBytes("UTF-8");
UUID uuid = UUID.nameUUIDFromBytes(bytes);

Java не обеспечивает реализацию для типа 5. Проверьте наш исходный кодrepository для UUIDv5.

2.2. Версия 4

Реализация UUID v4 использует случайные числа в качестве источника. Реализация Java -SecureRandom, которая использует непредсказуемое значение в качестве начального числа для генерации случайных чисел, чтобы уменьшить вероятность конфликтов.

Давайте сгенерируем UUID версии 4:

UUID uuid = UUID.randomUUID();

Давайте сгенерируем уникальный ключ, используя SHA-256 и случайный UUID:

MessageDigest salt = MessageDigest.getInstance("SHA-256");
salt.update(UUID.randomUUID().toString().getBytes("UTF-8"));
String digest = bytesToHex(salt.digest());

3. Заключение

И UUIDv3, и UUIDv5 обладают хорошим свойством, заключающимся в том, что разные системы могут генерировать один и тот же UUID, используя одно и то же пространство имен и имя. Они в основном используются для создания иерархических UUID.

Поскольку обе хеш-функции MD5 и SHA1 были повреждены, рекомендуется использовать v5. Если вам просто нужна простая генерация UUID, введите 4 для обычного варианта использования.

И, как всегда, доступен исходный код реализацииover on Github.