如何在 bash 中创建 UUID?

如何在 bash 中创建 UUID?

在 Java 中可以创建一个随机唯一唯一标识符

UUID uuid = UUID.randomUUID();

如何在 Bash 中做到这一点?

答案1

请参阅uuidgen属于e2fsprogs包裹。

根据libuuid现在是util-linux并且 e2fsprogs 中的包含正在逐步淘汰。但是,在新的 Ubuntu 系统上,uuidgen现在包含在uuid-runtime软件包中。

要创建 uuid 并将其保存在变量中:

uuid=$(uuidgen)

在我的 Ubuntu 系统上,字母字符以小写形式输出,而在我的 OS X 系统上,它们以大写形式输出(感谢 David 在评论中指出这一点)。

要切换到全部大写(按照上述方法生成后):

uuid=${uuid^^}

要切换到全部小写:

uuid=${uuid,,}

例如,如果您有两个 UUID,并且想要在 Bash 中比较它们,忽略它们的大小写,您可以tolower()像这样进行样式比较:

if [[ ${uuid1,,} == ${uuid2,,} ]]

答案2

为了在不添加外部依赖的情况下增加多样性,Linux你可以做:

UUID=$(cat /proc/sys/kernel/random/uuid)

为了传播不良做法,FreeBSD,在 Linux 兼容层(Linuxulator?)下,

UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid)

参考:

答案3

只是为了完整性... dbusDebian 上的软件包中还安装了 UUID 生成器。我之前没看到它。它可能与 e2fsprogs 软件包的算法相同,但它没有添加破折号,因此对您来说可能更简洁一些:

$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d

$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6

Grawity 添加了一条安全提示:“DBus UUID 与以下项不相关或不兼容:RFC 4122。 除了,dbus-uuidgen总是使用 Unix 时间戳作为最后 4 个字节。因此它们可能不适合某些用途。”(谢谢 Grawity,我应该在手册页中发现这一点。)

答案4

我发现这个脚本“一行”在 uuidgen 不可用时很有用。这还可以避免为 Perl 或 Python 安装外部模块的必要性。

od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'

在 SnowLeopard、Red Hat Valhalla、Solaris 9 4/04 及更新版本上测试成功。我很好奇这是否容易出现非唯一性,但在过去 10 年里我还没有被“咬”过。当然,也head -1可以用 too 代替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

993bb8d7-323d-b5ee-db78-f976a59d8284

相关内容