185
Смотрите uuidgen
программу, которая является частью пакета e2fsprogs .
Согласно этому , libuuid
теперь является частью util-linux, и включение в e2fsprogs постепенно прекращается. Тем не менее, на новых системах Ubuntu, uuidgen
теперь в uuid-runtime
пакете.
Чтобы создать uuid и сохранить его в переменной:
uuid=$(uuidgen)
В моей системе Ubuntu буквенные символы выводятся в нижнем регистре, а в моей системе OS X - в верхнем (спасибо Дэвиду за то, что он указал это в комментарии).
Чтобы переключиться на весь верхний регистр (после генерации, как указано выше):
uuid=${uuid^^}
Чтобы переключиться на все строчные буквы:
uuid=${uuid,,}
Если, например, у вас есть два UUID и вы хотите сравнить их в Bash, игнорируя их регистр, вы можете выполнить tolower()
сравнение стилей следующим образом:
if [[ ${uuid1,,} == ${uuid2,,} ]]
uuid-runtime
echo -e 'f\nF' | grep '[[:xdigit:]]'
выводит обе строки). Если это имеет значение для вас, и у вас есть Bash 4, вы можете сделать это, чтобы сделать его строчным:uuid=$(uuidgen); uuid=${uuid,,}
или это, чтобы сделать его заглавным:uuid=$(uuidgen); uuid=${uuid^^}
или что-то в этом духе, чтобы провестиtolower()
тест на стиль:if [[ ${uuid1,,} == ${uuid2,,} ]]
Чтобы добавить разнообразие без добавления внешних зависимостей, в Linux вы можете сделать:
Чтобы распространять плохие практики, во FreeBSD , под уровнем совместимости с linux (linuxulator?),
Рекомендации:
источник
Просто для полноты ... В
dbus
Debian также установлен UUID-генератор с пакетом. Я пропустил это, оглядываясь раньше. Вероятно, это тот же алгоритм, что и в пакете e2fsprogs, но он не добавляет тире, поэтому он может быть немного чище для вас:Grawity добавляет совет по безопасности: «UUID DBus не связаны или не совместимы с RFC 4122. Кроме того, dbus-uuidgen всегда использует метку времени Unix в качестве последних 4 байтов. Поэтому они могут быть неподходящими для некоторых применений». (Спасибо, Гравити, я должен был это заметить на странице руководства.)
источник
dbus-uuidgen
всегда использует метку времени Unix в качестве последних 4 байтов. Таким образом, они могут быть непригодны для некоторых целей.Если вы не хотите зависеть от других исполняемых файлов, или вы не можете использовать их, здесь чистая версия Баша от здесь :
источник
T
Переменная может быть устранена , иfor T
цикл может быть изменен на:case $N in 3 | 5 | 7 | 9) printf '-';; esac
(разбиты на отдельные строки , если предпочтительнее).case
для удаленияif
операторов, а также внутреннегоfor
оператора. Это делает код намного аккуратнее. Обратите внимание, что обаB%15
должны бытьB%16
иB%255
должны бытьB%256
.source <(curl url)
или что-то ещеЯ нашел этот скрипт «однострочным» полезным, когда uuidgen недоступен. Это также позволяет обойти любую необходимость установки внешних модулей для Perl или Python.
Успешно протестировано на SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 и новее. Мне любопытно, не склонен ли он к уникальности, но за последние 10 лет меня не «укусили». Конечно,
head -1
можно заменить наhead -_other-value_ | tail -1
тоже.Объяснить,
/dev/random
и/dev/urandom
являются случайными генераторами ядра.od
(восьмеричный дамп) имеет шестнадцатеричный выходной переключатель (-x), выдающий 16 байтов на строку.head
-n [| tail -1] (где n> 0) извлекает только одну строку предыдущего вывода.awk
устанавливает OutputFieldSeparator как дефис везде, где в операторе печати встречается запятая. Определяя поля 2-9 независимо, мы контролируем дефисы и убираем счетчик индекса / смещения, с которым префикс 'od' ставит перед каждой строкой вывода.Результатом является образец
8-4-4-4-12
строчных буквa-f0-9
.источник
od -x /dev/urandom | head -1 | awk '{OFS="-"; srand($6); sub(/./,"4",$5); sub(/./,substr("89ab",rand()*4,1),$6); print $2$3,$4,$5,$6,$7$8$9}'
Просто чтобы питон не чувствовал себя обделенным:
Чтобы использовать его в оболочке:
Посмотрите UUID Документации Python для типов UUIDS, которые могут быть сгенерированы.
Чтобы сгенерировать системный ID, совместимый с идентификатором компьютера, на компьютере, отличном от systemd, вы можете использовать python для этого:
источник
python3 -c "import uuid; print(uuid.uuid4())"
для python3Perl предоставляет библиотеку UUID на основе
e2fsprogs
пакета. В моей системе Debian этоlibuuid-perl
пакет. Вот пример одной строки; смотритеman uuid
больше:Это было бы тривиально добавить в шеллскрипт с обратными чертами или
$()
обозначениями:источник
Работал на меня, потом я бегал
uuid
источник
Я написал небольшую функцию Bash, используя Python для генерации произвольного количества UUID:
Если вы предпочитаете строчные буквы, измените:
Для того, чтобы:
источник
Пожалуйста, посмотрите на библиотеку OSSP UUID ( http://www.ossp.org/pkg/lib/uuid/ ) и рассмотрите возможность ее установки. Некоторые проекты предлагают его в качестве опции (например, PostgreSQL). Он правильно обрабатывает UUID версии 3 и версии 5 , что было выше того, что могла обработать моя установленная (например, e2fsprogs) библиотека. К счастью, openSUSE имеет его в одном из основных репозиториев. Получение версии для работы с Windows (например, Cygwin) или MySQL было непростым делом. Похоже, пришло время перейти на Linux / PostgreSQL / Python (и мне так понравился графический интерфейс SQLyog для MySQL / MariaDB), поскольку мне действительно нужны UUID v3 и v5.
источник
-v3 ns:URL custom-data
механизм заполнения.Я уверен, что некоторые прибудут сюда и просто ищут простой способ создания уникального идентификатора для использования в своих сценариях, и он не должен быть истинным UUID.
Если это так, вы можете просто сделать следующее, что сгенерирует уникальный идентификатор с точностью до секунды - так что если вы запустите это несколько раз в течение секунды, вы все равно получите тот же результат.
будет генерировать идентификаторы, подобные следующим, основываясь на текущем системном времени:
ПРИМЕЧАНИЕ. Если вы работаете в Linux или Coreutils установлены на Mac, вы можете использовать следующее для генерации уникального идентификатора наносекунды:
или если вы предпочитаете решение на основе Python вплоть до наносекунды, которое должно работать почти везде, запустите:
источник
mktemp -u
как вMYID="$(mktemp -u)"
. Если вы можете позволить себе хранить временные файлы до перезагрузки, оставьте-u
:MYID="$(mktemp)"
Эта тема с ее разнообразными примерами была очень полезна для меня. Мне часто нужны функции uuid из разных сред. И хотя мне нравятся чистые примеры bash, иногда удобнее использовать библиотеку на другом языке.
Так что для большей полноты, ruby (1.9.3+) имеет встроенный модуль SecureRandom, содержащий ряд полезных хеш-функций и функций id. Вы можете сделать это из Bash Cli.
источник
источник
od -X -A n /dev/random | head -1 | cut -c3-38
дает вам это ниже echo $ x 4151540a 1f7d0bef 8a0725fb d26183a3 uuid =echo ${x} | cut -c1-8
-echo ${x} | cut -c10-13
-echo ${x} | cut -c14-17
-echo ${x} | cut -c19-22
-echo ${x} | cut -c23-26``echo ${x} | cut -c28-35
echo $ uuid 4151540a-1f7d-0bef-8a07-25fbd26183a3Если вы используете Java 10.
источник
jshell
можно использовать сценарии bash , а не интерактивную команду . Это очень ясно в оригинальном посте.echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">"
но это гораздо более затянуто, чемuuidgen
.