In Java ist es möglich, eine zufällige UUID zu erstellen :
UUID uuid = UUID.randomUUID();
Wie geht das in Bash?
Sehen Sie sich das uuidgen
Programm an, das Teil des e2fsprogs- Pakets ist.
Nach diesem , libuuid
ist jetzt Teil von util-linux und die Aufnahme in e2fsprogs wird eingestellt. Allerdings ist auf neuen Ubuntu-Systemen uuidgen
jetzt im uuid-runtime
Paket.
So erstellen Sie eine UUID und speichern sie in einer Variablen:
uuid=$(uuidgen)
Auf meinem Ubuntu-System werden die Buchstaben als Kleinbuchstaben und auf meinem OS X-System als Großbuchstaben ausgegeben (danke an David, der dies in einem Kommentar hervorgehoben hat).
So wechseln Sie in Großbuchstaben (nach dem Generieren wie oben):
uuid=${uuid^^}
So wechseln Sie zu Kleinbuchstaben:
uuid=${uuid,,}
Wenn Sie zum Beispiel zwei UUIDs haben und diese in Bash vergleichen möchten, ohne die Groß- und Kleinschreibung zu beachten, können Sie einen tolower()
Stilvergleich wie folgt durchführen:
if [[ ${uuid1,,} == ${uuid2,,} ]]
uuid-runtime
ohne ersichtlichen Grund in das Paket ... +1 für Sie)echo -e 'f\nF' | grep '[[:xdigit:]]'
beide Zeilen ausgeben). Wenn es eine Rolle für Sie tut , und Sie haben Bash 4, können Sie dies tun , um es tiefer Fall zu machen:uuid=$(uuidgen); uuid=${uuid,,}
oder diese Großbuchstaben zu machen:uuid=$(uuidgen); uuid=${uuid^^}
oder etwas in dieser Richtung eine tuntolower()
Stil - Test:if [[ ${uuid1,,} == ${uuid2,,} ]]
Unter Linux können Sie Folgendes tun, um die Vielfalt zu erhöhen, ohne externe Abhängigkeiten hinzuzufügen :
Um schlechte Praktiken unter FreeBSD unter der Linux-Kompatibilitätsebene (linuxulator?) Zu verbreiten,
Verweise:
quelle
Der Vollständigkeit halber ... Es gibt auch einen UUID-Generator, der mit dem
dbus
Paket auf Debian installiert ist . Ich habe es vermisst, als ich mich früher umgesehen habe. Es ist wahrscheinlich derselbe Algorithmus wie das e2fsprogs-Paket, fügt jedoch keine Bindestriche hinzu, sodass es für Sie möglicherweise etwas sauberer ist:Grawity fügt einen Sicherheitstipp hinzu: "DBus-UUIDs sind nicht mit RFC 4122 verwandt oder kompatibel . Außerdem verwendet dbus-uuidgen immer den Unix-Zeitstempel als die letzten 4 Bytes. Daher sind sie möglicherweise für einige Verwendungszwecke ungeeignet." (Danke, Grawity, ich hätte das auf der Manpage sehen sollen.)
quelle
dbus-uuidgen
immer den Unix-Zeitstempel als die letzten 4 Bytes. Daher sind sie möglicherweise für einige Zwecke ungeeignet.Wenn Sie nicht von anderen ausführbaren Dateien abhängig sein möchten oder diese nicht verwenden können, finden Sie hier die reine Bash-Version von hier :
quelle
T
Variable kann entfernt werden und diefor T
Schleife kann geändert werden in:case $N in 3 | 5 | 7 | 9) printf '-';; esac
(auf Wunsch in getrennten Zeilen).case
der sowohl dieif
Anweisungen als auch die innerefor
Anweisung entfernt werden. Es macht den Code viel ordentlicher. Beachten Sie, dass beidesB%15
sein sollteB%16
undB%255
sollteB%256
.source <(curl url)
Ich fand dieses Skript "one-liner" nützlich, wenn uuidgen nicht verfügbar ist. Dadurch wird auch die Notwendigkeit umgangen, externe Module für Perl oder Python zu installieren.
Getestet auf SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 und neuer erfolgreich. Ich bin neugierig, ob dies zur Nicht-Einzigartigkeit neigt, aber ich bin in den letzten 10 Jahren nicht "gebissen" worden. Könnte natürlich
head -1
auch durch ersetzthead -_other-value_ | tail -1
werden.Erklären,
/dev/random
und/dev/urandom
sind Kernel-Zufallsgeneratoren.od
(Octal Dump) hat einen Hex-Ausgangsschalter (-x), der 16 Bytes pro Zeile erzeugt.head
-n [| tail -1] (wobei n> 0 ist) extrahiert nur eine Zeile der vorherigen Ausgabe.awk
Legt fest, dass der OutputFieldSeparator überall dort, wo in der print-Anweisung ein Komma vorkommt, ein Bindestrich ist. Indem wir die Felder 2 bis 9 unabhängig voneinander angeben, steuern wir die Bindestriche und entfernen den Index- / Versatzzähler, der jeder Ausgabezeile das Präfix "od" voranstellt.Das Ergebnis ist ein Muster aus
8-4-4-4-12
Kleinbuchstabena-f0-9
.quelle
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}'
Nur damit Python nicht ausgelassen wird:
So verwenden Sie es in der Shell:
Informationen zu den Arten von UUIDS, die generiert werden können, finden Sie in der UUID der Python-Dokumentation .
Um eine systemd-Rechner-ID-kompatible Datei auf einem Nicht-systemd-Rechner zu generieren, können Sie Python folgendermaßen verwenden:
quelle
python3 -c "import uuid; print(uuid.uuid4())"
für Python3Perl stellt eine UUID-Bibliothek bereit, die auf dem
e2fsprogs
Paket basiert . Auf meinem Debian-System ist es daslibuuid-perl
Paket. Hier ist ein Beispiel für einen Einzeiler. sieheman uuid
für mehr:Dies wäre trivial, um ein Shellscript mit Backticks oder
$()
Notation zu ergänzen :quelle
Hat für mich gearbeitet, dann bin ich weggelaufen
uuid
quelle
Ich habe eine kleine Bash-Funktion mit Python geschrieben, um eine beliebige Anzahl von UUIDs in großen Mengen zu generieren:
Wenn Sie Kleinbuchstaben bevorzugen, ändern Sie:
Zu:
quelle
Sehen Sie sich die OSSP-UUID-Bibliothek ( http://www.ossp.org/pkg/lib/uuid/ ) an und installieren Sie sie. Einige Projekte bieten es als Option an (zB PostgreSQL). Die UUIDs von Version 3 und Version 5 wurden ordnungsgemäß verarbeitet , was über das hinausging, was meine installierte Bibliothek (z. B. e2fsprogs) verarbeiten konnte. Glücklicherweise hat openSUSE es in einem der Hauptrepos. Eine Version mit Windows (zB Cygwin) oder MySQL zum Laufen zu bringen, war ein Problem. Anscheinend ist es an der Zeit, auf Linux / PostgreSQL / Python umzusteigen (und ich mochte die SQLyog-GUI für MySQL / MariaDB so sehr), da ich wirklich UUIDs der Versionen 3 und 5 benötige.
quelle
-v3 ns:URL custom-data
Seeding-Mechanismus unterstützt.Ich bin mir sicher, dass einige hier ankommen werden und nur nach einer einfachen Möglichkeit suchen, eine eindeutige ID zur Verwendung in ihren Skripten zu generieren, und es muss keine echte UUID sein.
In diesem Fall können Sie einfach Folgendes tun, wodurch eine sekundengenaue ID generiert wird. Wenn Sie diese also mehrmals innerhalb einer Sekunde ausführen, erhalten Sie immer noch dasselbe Ergebnis.
generiert ausgehend von der aktuellen Systemzeit IDs wie die folgenden:
HINWEIS: Wenn Sie unter Linux arbeiten oder Coreutils auf einem Mac installiert haben, können Sie Folgendes verwenden, um eine eindeutige ID für die Nanosekunde zu generieren:
oder wenn Sie eine Python-basierte Lösung bis zur Nanosekunde bevorzugen, die fast überall funktionieren sollte, führen Sie Folgendes aus:
quelle
mktemp -u
wie inMYID="$(mktemp -u)"
. Wenn Sie es sich leisten können, leere temporäre Dateien bis zum Neustart-u
MYID="$(mktemp)"
Dieser Thread mit seinen vielfältigen Beispielen hat mir wirklich geholfen. Ich benötige häufig UUID-Funktionen aus verschiedenen Umgebungen. Und obwohl ich die reinen Bash-Beispiele liebe, ist es manchmal bequemer, eine Bibliothek in einer anderen Sprache zu verwenden.
Ruby (1.9.3+) verfügt über das integrierte SecureRandom-Modul, das eine Reihe nützlicher Hash- und ID-Funktionen enthält. Von der Bash Cli aus können Sie dies tun.
quelle
quelle
od -X -A n /dev/random | head -1 | cut -c3-38
gibt das unten an: 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-25fbd26183a3Wenn Sie Java 10 verwenden.
quelle
jshell
verwendet werden können , und nicht als interaktiver Befehl . Das wird im ursprünglichen Beitrag sehr deutlich.echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">"
Aber es ist viel langatmiger alsuuidgen
.