En Java es posible crear un UUID aleatorio :
UUID uuid = UUID.randomUUID();
¿Cómo hacer esto en Bash?
Vea el uuidgen
programa que forma parte del paquete e2fsprogs .
De acuerdo con esto , libuuid
ahora es parte de util-linux y la inclusión en e2fsprogs se está eliminando gradualmente. Sin embargo, en los nuevos sistemas Ubuntu, uuidgen
ahora está en el uuid-runtime
paquete.
Para crear un uuid y guardarlo en una variable:
uuid=$(uuidgen)
En mi sistema Ubuntu, los caracteres alfabéticos se muestran en minúsculas y en mi sistema OS X, se muestran en mayúsculas (gracias a David por señalar esto en un comentario).
Para cambiar a mayúsculas (después de generarlo como se indica arriba):
uuid=${uuid^^}
Para cambiar a minúsculas:
uuid=${uuid,,}
Si, por ejemplo, tiene dos UUID y desea compararlos en Bash, ignorando su caso, puede hacer una tolower()
comparación de estilo como esta:
if [[ ${uuid1,,} == ${uuid2,,} ]]
uuid-runtime
paquete sin razón aparente ... +1 para usted)echo -e 'f\nF' | grep '[[:xdigit:]]'
genera ambas líneas). Si es importante para usted y tiene Bash 4, puede hacer esto para que aparezca en minúscula:uuid=$(uuidgen); uuid=${uuid,,}
o esto para que sea en mayúscula:uuid=$(uuidgen); uuid=${uuid^^}
o algo así para hacer unatolower()
prueba de estilo:if [[ ${uuid1,,} == ${uuid2,,} ]]
Para agregar variedad sin agregar dependencias externas, en Linux puede hacer:
Para propagar malas prácticas, en FreeBSD , bajo la capa de compatibilidad de linux (¿linuxulator?),
Referencias
fuente
Solo por razones de integridad ... También hay un generador UUID instalado con el
dbus
paquete en Debian. Me perdí mirando alrededor antes. Probablemente sea el mismo algoritmo que el paquete e2fsprogs, pero no agrega guiones, por lo que podría ser un poco más limpio para usted:Grawity agrega un consejo de seguridad: "Los UUID de DBus no están relacionados ni son compatibles con RFC 4122. Además, dbus-uuidgen siempre usa la marca de tiempo Unix como los últimos 4 bytes. Por lo tanto, podrían no ser adecuados para algunos usos". (Gracias, Grawity, debería haberlo visto en la página del manual).
fuente
dbus-uuidgen
siempre utiliza la marca de tiempo de Unix como los últimos 4 bytes. Por lo tanto, pueden no ser adecuados para algunos usos.Si no desea depender de otros ejecutables, o no puede usarlos, aquí está la versión pura de bash desde aquí :
fuente
T
variable se puede eliminar y elfor T
bucle se puede cambiar a:case $N in 3 | 5 | 7 | 9) printf '-';; esac
(dividido en líneas separadas si se prefiere).case
para eliminar lasif
declaraciones, así como lafor
declaración interna . Hace que el código sea mucho más ordenado. Tenga en cuenta que ambosB%15
deberían serB%16
yB%255
deberían serB%256
.source <(curl url)
o lo que seaHe encontrado este script "one-liner" útil donde uuidgen no está disponible. Esto también evita cualquier necesidad de instalar módulos externos para Perl o Python.
Probado en SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 y más reciente con éxito. Tengo curiosidad por saber si esto es propenso a la no singularidad, pero no he sido 'mordido' en los últimos 10 años. Por supuesto,
head -1
podría ser reemplazado conhead -_other-value_ | tail -1
también.Para explicar,
/dev/random
y/dev/urandom
son generadores aleatorios de kernel.od
(volcado octal) tiene un interruptor de salida hexadecimal (-x) que produce 16 bytes por línea.head
-n [| tail -1] (donde n> 0) extrae solo una línea de la salida anterior.awk
configura OutputFieldSeparator para que sea un guión en todos los lugares donde aparece una coma en la declaración de impresión. Al especificar los campos 2-9 de forma independiente, controlamos los guiones y eliminamos el índice / contador de desplazamiento con el que 'od' prefija cada línea de salida.El resultado es un patrón de
8-4-4-4-12
caracteres en minúsculaa-f0-9
.fuente
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}'
Solo para que Python no se sienta excluido:
Para usarlo en el shell:
Consulte el UUID de documentación de Python para conocer los tipos de UUIDS que se pueden generar.
Para generar un archivo systemd machine-id compatible en una máquina que no sea systemd, puede usar python para hacerlo de esta manera:
fuente
python3 -c "import uuid; print(uuid.uuid4())"
para python3Perl proporciona una biblioteca UUID basada en el
e2fsprogs
paquete. En mi sistema Debian es ellibuuid-perl
paquete. Aquí hay un ejemplo de una línea; verman uuid
para más:Sería trivial agregar a un shellscript con backticks o
$()
notación:fuente
Trabajó para mí, luego corrí
uuid
fuente
Escribí una pequeña función Bash usando Python para generar un número arbitrario de UUID en masa:
Si prefiere minúsculas, cambie:
A:
fuente
Mire la biblioteca OSSP UUID ( http://www.ossp.org/pkg/lib/uuid/ ) y considere instalarla. Algunos proyectos lo ofrecen como una opción (por ejemplo, PostgreSQL). Maneja correctamente los UUID de la versión 3 y la versión 5 , que estaba más allá de lo que podía manejar mi biblioteca instalada (por ejemplo, e2fsprogs). Afortunadamente, openSUSE lo tiene en uno de los repositorios principales. Conseguir una versión para trabajar con Windows (por ejemplo, Cygwin) o MySQL ha sido un fracaso. Parece que es hora de cambiar a Linux / PostgreSQL / Python (y me encantó la GUI de SQLyog para MySQL / MariaDB) ya que realmente necesito UU3 v3 y v5.
fuente
-v3 ns:URL custom-data
mecanismo de propagación.Estoy seguro de que algunos llegarán aquí, y solo están buscando una manera fácil de generar una ID única para usar en sus scripts, y no necesita ser un verdadero UUID.
Si es así, puede hacer lo siguiente, lo que generará una identificación única hasta el segundo, por lo que si ejecuta esto varias veces en un segundo, aún obtendrá el mismo resultado.
generará identificadores como los siguientes en función de la hora actual del sistema:
NOTA: Si está en Linux o tiene Coreutils instalado en una Mac, puede usar lo siguiente para generar una identificación única para el nanosegundo:
o si prefiere una solución basada en Python hasta el nanosegundo, que debería funcionar en casi todas partes, ejecute:
fuente
mktemp -u
como enMYID="$(mktemp -u)"
. Si puede permitirse el lujo de tener archivos temporales vacíos por ahí hasta el reinicio, deje caer-u
:MYID="$(mktemp)"
Este hilo, con sus variados ejemplos, fue realmente útil para mí. Con frecuencia necesito funciones uuid de varios entornos diferentes. Y aunque me encantan los ejemplos de bash puro, a veces es más conveniente usar una biblioteca de un idioma diferente.
Entonces, solo por rigor, ruby (1.9.3+) tiene el módulo SecureRandom incorporado que contiene una serie de funciones útiles de hash e id. Desde bash cli, puedes hacer esto.
fuente
fuente
od -X -A n /dev/random | head -1 | cut -c3-38
le da esto a continuación 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-25fbd26183a3Si está utilizando Java 10.
fuente
jshell
se puede usar en scripts de bash , y no como un comando interactivo . Eso está muy claro en la publicación original.echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">"
Pero es mucho más largo queuuidgen
.