Подтвердить что ты не робот

Тип персонажа, генерируемого UUID

  • Создает ли java.util.UUID специальные символы?
  • Каков тип каждого символа (например, верхний регистр, строчный регистр, цифры), сгенерированный UUID.
4b9b3361

Ответ 1

UUID ≠ текст

Для пояснения, UUID на самом деле является 128-битным значением, а не текстом или цифрами. Вы можете думать о них как о 128-битных целых числах без знака.

Шестнадцатеричная строка

Люди плохо читают и пишут 128 бит, используя 128 символов 1 и 0. Когда UUID должен быть написан для потребления человеком, мы используем строку шестнадцатеричной (цифры 0 - 9 и буквы a - f) в формате base-16. Мы используем 32 шестнадцатеричных символа, сгруппированных с 4 дефисами, чтобы представить эти 128 битов в общей сложности 36 символов. Например:

550e8400-e29b-41d4-a716-446655440000

Нет "специальных" символов

Что касается "специальных символов", упомянутых в Вопросе, вы увидите только эти 23 возможных символа в шестнадцатеричном представлении UUID:

abcdefABCDEF1234567890-

В нижнем регистре требуется спецификация

Последняя международная спецификация от 2008-08 гг. Гласит (выделено мое):

6.5.4 Программное обеспечение, генерирующее шестнадцатеричное представление UUID , не должно использовать буквы верхнего регистра. ПРИМЕЧАНИЕ. - Рекомендуется, чтобы шестнадцатеричное представление, используемое во всех читаемых человеком форматах, было ограничено буквами lower-. Программное обеспечение, обрабатывающее это представление, однако, должно принимать как заглавные, так и строчные буквы, как указано в 6.5.2.

Обычные нарушения

Однако Microsoft, Apple и другие обычно нарушают правило строчных букв. В какой-то момент Microsoft выпустила программное обеспечение, которое генерировало смешанный регистр (с использованием upper- и строчных букв), очевидно, непреднамеренную функцию.

Сделайте так, как сказано в спецификации:

  • Используйте строчные буквы для вывода.
  • Допускать строчные или прописные для ввода.

Документация Java для метода UUID класса toString документирует в BNF, что верхний регистр допускается при генерации строки, что противоречит стандартной спецификации UUID, Однако фактическое поведение класса и его метода toString в реализации Oracle для Java 8 является правильным, с использованием строчных букв для вывода, но допускается либо ввод прописных, либо строчных букв.

Введите либо lower-/заглавные буквы:

UUID uuidFromLowercase = UUID.fromString ( "897b7f44-1f31-4c95-80cb-bbb43e4dcf05" ); 
UUID uuidFromUppercase = UUID.fromString ( "897B7F44-1F31-4C95-80CB-BBB43E4DCF05" );

Вывод только в нижний регистр:

System.out.println ( "uuidFromLowercase.toString(): " + uuidFromLowercase );
System.out.println ( "uuidFromUppercase.toString(): " + uuidFromUppercase );

uuidFromLowercase.toString(): 897b7f44-1f31-4c95-80cb-bbb43e4dcf05

uuidFromUppercase.toString(): 897b7f44-1f31-4c95-80cb-bbb43e4dcf05

Смотрите этот код, запускаемый вживую на IdeOne.com.

Нулевое значение

Когда UUID еще не известен, вы можете использовать специальный UUID, состоящий из всех нулей.

00000000-0000-0000-0000-000000000000

Пример значений

Вы можете увидеть некоторые примеры значений UUID, используя любой из множества веб-сайтов, генерирующих значения. Например:

Или используйте инструмент командной строки. Почти каждая операционная система поставляется в комплекте с таким инструментом. В Mac OS X запустите Terminal.app и введите uuidgen.

Ответ 2

javadoc для java.util.UUID ссылки на RFC 4122, в котором говорится

  Each field is treated as an integer and has its value printed as a
  zero-filled hexadecimal digit string with the most significant
  digit first.  The hexadecimal values "a" through "f" are output as
  lower case characters and are case insensitive on input.

Нет, он не будет генерировать специальные символы.

Ответ 3

UUID не состоит из символов, если вы не попросите его преобразовать в строку. В этот момент он будет преобразован в строку, состоящую из шестнадцатеричных символов и дефис, как описано в документации для UUID.toString().

(Он не задокументировал, будут ли шестнадцатеричные цифры верхним или нижним регистром.)

Ответ 4

Согласно Интернету RFC 4122,

Каждое поле рассматривается как целое число, и его значение печатается как заполненная нулями строка шестнадцатеричных цифр с наиболее значимым цифра первая. Шестнадцатеричные значения от "a" до "f" выводятся как строчные буквы и нечувствительны к регистру при вводе.

Если вы уважаете интернет-стандарт, всегда используйте строчные буквы.

Хотя BNF определяет заглавные буквы, он предназначен для ввода, а не вывода.