为什么 uuid() 在 MariaDB 中创建非常相似的标识符?

Why uuid() creates very similar identifiers in MariaDB?

我正在为 MariaDB 创建一个代码生成器,以根据给定的 JSON.

创建一个数据库

在那JSON中,一些初始数据也存在。因此我遍历数据并将它们插入数据库。

有些列有 uuid() 默认值。

这是我的代码将数据插入 table 的结果:

Id,Guid,Key,Order
1,5c52e1db-6809-11ec-982c-0242c0a81003,New,
2,5c530e55-6809-11ec-982c-0242c0a81003,WaitingForBusinessResponse,
3,5c533551-6809-11ec-982c-0242c0a81003,WaitingForUserResponse,
4,5c536433-6809-11ec-982c-0242c0a81003,UnderInvestigation,
5,5c538ba5-6809-11ec-982c-0242c0a81003,Closed,

如您所见,UUID 值彼此非常非常接近。此列上有一个唯一索引,因此不允许重复条目。但是这些值使得跟踪它们变得困难,并且很容易将它们相互混淆。

有没有办法改变这种行为?我想告诉 MariaDB 更随机地创建 UUID。

简单的答案是“不,你不能”,除非你编写自己的 uuid 函数,该函数提供了一种从随机数或伪随机数创建 uuid() 的算法如 RFC 4122

第 4.4 章所述

MariaDB(和MySQL)的 uuid() 函数是根据 RFC 4122 实现的,但使用了创建基于时间的 uuid 的算法(参见第 4.2 章)

由于所有算法(基于名称、基于时间、随机)都提供了一个在 space 和时间中全局唯一的通用唯一标识符,我真的不明白你为什么要随时更改算法随机。

使用 uuidgen 和 mariadb 的基于时间的 uuid:

~$ uuidgen -t;uuidgen -t
a5d3c032-6865-11ec-bd1f-1740cb8be951
a5d42d24-6865-11ec-bd1f-1740cb8be951
    
~$ mariadb -e"select uuid()\G";mariadb -e"select uuid()\G"
*************************** 1. row ***************************
uuid(): 45aca397-683c-11ec-a913-d83bbf89f2e2
*************************** 1. row ***************************
uuid(): 45ad94dd-683c-11ec-a913-d83bbf89f2e2