Тип персонажа, сгенерированный UUID - PullRequest
21 голосов
/ 24 ноября 2011
  1. Создает ли java.util.UUID специальные символы?
  2. Какой тип каждого символа (например, заглавные, строчные, цифры) генерируется UUID.

Ответы [ 3 ]

40 голосов
/ 12 декабря 2012

UUID ≠ текст

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

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

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

550e8400-e29b-41d4-a716-446655440000

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

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

abcdefABCDEF1234567890-

Нижний регистр необходим по спецификации

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

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

Нарушения Общие

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

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

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

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

Ввод вв нижнем / верхнем регистре:

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.

8 голосов
/ 24 ноября 2011

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.

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

6 голосов
/ 24 ноября 2011

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

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

...