Java.util.UUID.randomUUID(). toString() length

Используется ли длина java.util.UUID.randomUUID(). toString() всегда равная 36?

Я не смог найти информацию об этом. Здесь сказано только следующее:

общедоступный статический UUID randomUUID() Статический factory для получения UUID типа 4 (псевдослучайно сгенерированный). UUID генерируется с использованием криптографически сильного генератора псевдослучайных чисел. Возвращает: Случайно сгенерированный UUID

И что type 4 ничего мне не говорит. Я не знаю, что означает тип 4 в этом случае.

Ответ 1

Всегда ли java.util.UUID.randomUUID(). ToString() длина равна 36?

Да!! это.

UUID самом деле 128-битное значение (2 длинные). Чтобы представить 128 бит в шестнадцатеричную строку, будет 128/4 128/4=32 символа (каждый символ имеет длину 4 бита). В строковом формате он также содержит 4 (-), поэтому длина равна 36.

пример: 54947df8-0e9e-4471-a2f9-9af509fb5889

32 шестнадцатеричных символа + 4 символа дефиса = 36 символов Так что длина будет всегда одинаковой.


Обновить:

Я не знаю, что означает тип 4 в корпусе.

К вашему сведению: есть несколько способов генерации UUID. Здесь тип 4 означает, что этот uuid генерируется с использованием случайного или псевдослучайного числа. Из вики - Universally_unique_identifier # Версии:

Версии

Для обоих вариантов 1 и 2 в стандартах определены пять "версий", и каждая версия может быть более подходящей, чем другие, в конкретных случаях использования. Версия обозначается буквой М в строковом представлении.

UUID версии 1 генерируются из времени и идентификатора узла (обычно это MAC-адрес);

UUID версии 2 генерируются из идентификатора (обычно группы или идентификатора пользователя), времени и идентификатора узла;

версии 3 и 5 создают детерминированные UUID, сгенерированные хэшированием идентификатора и имени пространства имен;

и UUID версии 4 генерируются с использованием случайного или псевдослучайного числа.

Ответ 2

Вы можете преобразовать 16-байтовый UUIDv4 двоичный файл в 24-байтовый ascii, используя base64, вместо этого кодировать в ascii-hex (32 байта)

Ответ 3

Для таких, как я, которые начинают гуглить, прежде чем читать Javadoc, здесь Javadoc;)

UUID.toString

Для тех, кто не знает, как читать грамматическое дерево, читайте снизу вверх.
hexDigit - это один символ
hexOctet равен 2 hexDigits = 2 символа
узел 6 * hexOctet = 6 * 2hexdigit = 6 * 2 символа = 12 символов
вариант _and_sequence: 2 * hexOctet = 2 * 2hexdigit = 2 * 2 символа = 4 символа
time_high_and_version - 2 * hexOctet = 2 * 2hexdigit = 2 * 2 символа = 4 символа
time_mid равно 2 * hexOctet = 2 * 2hexdigit = 2 * 2 символа = 4 символа
time_low - 4 * hexOctet = 4 * 2hexdigit = 4 * 2 символа = 8 символов
и наконец, UUID является <time_low> "-" <time_mid> "-" <time_high_and_version> "-" <variable_and_sequence> "-" <узел>

= 8 символов + 1 символ + 4 символа + 1 символ + 4 символа + 1 символ + 4 символа + 1 символ + 12 символов

= 36 символов! 128 бит данных + 4 дефиса, как указано ранее

The UUID string representation is as described by this BNF: 

 UUID                   = <time_low> "-" <time_mid> "-"
                          <time_high_and_version> "-"
                          <variant_and_sequence> "-"
                          <node>
 time_low               = 4*<hexOctet>
 time_mid               = 2*<hexOctet>
 time_high_and_version  = 2*<hexOctet>
 variant_and_sequence   = 2*<hexOctet>
 node                   = 6*<hexOctet>
 hexOctet               = <hexDigit><hexDigit>
 hexDigit               =
       "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
       | "a" | "b" | "c" | "d" | "e" | "f"
       | "A" | "B" | "C" | "D" | "E" | "F"