在 bash 中创建唯一的随机数 (UUID)

yae*_*ael 15 linux bash shell-script random uuid

我想创建随机唯一编号(UUID)如下

node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
Run Code Online (Sandbox Code Playgroud)

首先我试过这个

$ rndnum=` echo $RANDOM"-"echo $RANDOM"-"echo $RANDOM"-"echo $RANDOM"-"echo $RANDOM`

$ echo $rndnum
30380-echo 21875-echo 14791-echo 32193-echo 11503
Run Code Online (Sandbox Code Playgroud)

创建以下内容的正确方法f是什么(任何数字在哪里)?

ffffffff-ffff-ffff-ffff-ffffffffffff
Run Code Online (Sandbox Code Playgroud)

Hax*_*iel 42

在 Linux 上,util-linux/util-linux-ng包提供了一个生成 UUID 的命令:uuidgen.

$ uuidgen
5528f550-6559-4d61-9054-efb5a16a4de0
Run Code Online (Sandbox Code Playgroud)

引用手册

uuidgen 程序使用libuuid(3) 库创建(并打印)一个新的通用唯一标识符 (UUID) 。可以合理地认为新的 UUID 在本地系统上创建的所有 UUID 中以及过去和将来在其他系统上创建的 UUID 中是唯一的。

uuidgen 可以生成两种类型的 UUID:基于时间的 UUID 和基于随机的 UUID。默认情况下,如果存在高质量的随机数生成器,uuidgen 将生成基于随机的 UUID。否则,它将选择基于时间的 UUID。可以使用-ror-t选项强制生成这两种 UUID 类型之一。

附录:OP 在评论中提供了Presto DB 文档的链接。经过一番搜索,我发现了这个相关的讨论,其中明确提到该node.id属性确实是一个 UUID。


在评论中添加froschutz提供的信息:

作为uuidgen/libuuid方法的替代方法,您可以使用 Linux 内核本身公开的接口来生成 UUID:

$ cat /proc/sys/kernel/random/uuid
00db2531-365c-415c-86f7-503a35fafa58
Run Code Online (Sandbox Code Playgroud)

每次请求都会重新生成 UUID。

  • 如果 uuidgen 不可用,可能的回退:`cat /proc/sys/kernel/random/uuid` (21认同)
  • 最后一步是 `printf 'node.id=%s\n' "$( uuidgen )"` (2认同)
  • @frostschutz 好多了——这应该是答案 (2认同)

ins*_*ign 5

正如 @frostschutz 提到的,您可以使用无依赖的解决方案:

cat /proc/sys/kernel/random/uuid
Run Code Online (Sandbox Code Playgroud)

或保存变量

UUID=$(cat /proc/sys/kernel/random/uuid)
Run Code Online (Sandbox Code Playgroud)

在 Bash 中你可以简化为:

UUID=$(< /proc/sys/kernel/random/uuid)
Run Code Online (Sandbox Code Playgroud)