Насколько безопасно удалить "-" в случайно генерируемом UUID?

У меня есть этот код:

String uuid = UUID.randomUUID().toString().replace("-", "");

Насколько безопасно удалить "-" в сгенерированном UUID? Удалил бы его, чтобы он уничтожил цель быть глобально уникальным и сделать сгенерированный UUID склонным к столкновениям?

Ответ 1

насколько безопасно, если убрать "-" в сгенерированном UUID

Это 100% безопасно, так как тире не являются частью значения. Строковый UUID представляет собой шестнадцатеричное представление 128-битного значения. Черточки предназначены только для отображения, поэтому UUID будет немного проще для глаз.

Просто будьте осторожны при передаче UUID в форме String во внешние системы, такие как внешние API, базы данных и тому подобные вещи. Они могут ожидать, что там будут штрихи.

Ответ 2

Допустим, я хочу позвонить в Белый дом. Их номер телефона (202) 456-1111. Если я удалю все тире и круглые скобки с этого номера телефона, я оставил 2024561111. Я не терял никакой информации при этом - я просто изменил форматирование таким образом, что это затрудняет чтение. Если я пронумеровал это число в свой телефон, он все равно будет правильно звонить, потому что телефонная система все еще знает, что первые три цифры являются кодом зоны, а следующие семь являются основным номером.

Точно так же тире в UUID похожи на дополнительную пунктуацию в телефонном номере - они включаются так, что человеку легче читать некоторые основные количества. В UUID это число имеет длину 128 бит и записывается в шестнадцатеричном виде, поэтому, в отличие от номера телефона, его меньше "явно" число, но основной принцип тот же. Удаление тире не изменит номер и, таким образом, не повлияет на безопасность.

Теперь, что может случиться, что это нарушает совместимость форматирования между платформами. Вернемся к аналогии с номером телефона. Некоторые веб-сайты, которые я использовал, не позволяют мне вводить номер телефона 2024561111. Theyll настаивает на том, что я помещаю пробелы, тире и круглые скобки, как в (202) 456-1111. (Я не поклонник таких сайтов, но это другая история.) Поэтому удаление тире из вашего UUID потенциально может быть проблемой, если вам нужно передать строковое представление UUID в какой-то другой процесс или службу, ожидающие полного форматирования, включая запятые.

Ответ 3

Черточки в правильно сформированном UUID не помещаются случайным образом в строку - это конкретный формат, подробно описанный в RFC - http://www.ietf.org/rfc/rfc4122.txt

Таким образом, удаление тире не повлияет на уникальность UUID.

Однако это может вызвать проблемы с библиотеками, которые ожидают, что тире как часть UUID будут проверять его как UUID.

Почему вы хотите удалить их?

Ответ 4

Вы можете проверить, как создается строка, прочитав javadoc:

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>

Таким образом, удаление - отлично, вы можете повторно вставить их в нужное положение позже, если хотите, или воссоздать объект UUID содержащий ту же информацию.

Что касается уникальности: насколько уникален UUID?

Ответ 5

UUID - это 128-битное число.

Формат в шестнадцатеричном формате с дефисами - это только отображение изображений для потребления человеком. Это один из нескольких возможных визуализаций отображения, а формат отображения с дефисом или без него НЕ является самим UUID.

Ответ 6

UUID - это 128-битное число. Четыре бита цифры M указывают версию UUID, а от одного до трех наиболее значимых бит цифры N указывают вариант UUID. Бинарное кодирование UUID варьируется между системами. Многие системы кодируют UUID полностью в формате большой буквы.