Ответ 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
.