使用 uuid_generate_v1() 在 Azure PostgreSQL 中生成带有尾随零的 UUID

Using uuid_generate_v1() produces UUID with trailing zeros in Azure PostgreSQL

我不确定生成 UUID 值时这种奇怪的行为是怎么回事。我知道 uuid_generate_v1() 不如 uuid_generate_v4() 安全。

我们正在函数内部执行 uuid_generate_v1() 以生成唯一 ID。最初创建该函数时,它返回填充的 uuid 的所有段。我最近需要创建另一个 Azure PostgreSQL 实例并验证输出并注意到 uuid 的最后一段现在为零。我重新验证了我们拥有的其他 Azure PostgreSQL 实例,它们现在也返回尾随零。

uuid_generate_v4() 在所有实例上都能正常工作。

我在笔记本电脑的 docker 容器中安装了一个 PostgreSQL 9.6 版本,它 returns 填充了所有段。

uuid_id
9945111c-b305-11e9-aec6-977857a8b0e6
be647cc2-7cbd-11e9-8498-e7d5a16a0cec

fa1ee220-bf8e-11e9-8b75-000000000000

我在想可能执行了更新,但我不确定我会在哪里检查它。

希望有人遇到过这种情况。

缺少 MAC 地址

fa1ee220-bf8e-11e9-8b75-000000000000

该十六进制字符串表示生成 UUID 的机器的 128 bits of a UUID. Those last twelve hex characters are for the 48-bit node id. For Version 1 UUIDs, node id means the MAC address

其他大部分十六进制字符代表(a)当前日期和时间值的位,剩下的几个位代表(b)一个小的任意数,和(c)variant and version 的 UUID。这三个数据源很容易获得,所以没有问题,因此您会看到前四个部分已填写。

可能是 Azure 的错误

所以我猜您看到的错误是 Azure 未能为其托管数据库的虚拟机报告 MAC 地址

您没有发现第 4 版 UUID 有问题,因为该版本不使用 MAC 地址。 Version 4 使用随机生成的位,128 位中的 122 位是随机的。

您在笔记本电脑上没有发现问题,因为您的计算机(或您的 Docker 容器)正在向生成 UUID 值的 Postgres 插件正确报告其 MAC 地址。

我建议您将您的体验作为错误报告给 Azure 员工。 Azure 人员可能不会认为这是一个错误;出于您在问题中提到的安全原因,他们可能故意选择不公开其服务器的 MAC 地址。

我怀疑问题出在插件中包含的 Postgres, the Postgres plugin uuid-ossp, or the well-worn OSSP uuid 库。

解决方法

您可以尝试使用 OSSP 库提供的版本 1 UUID 的特殊变体:uuid_generate_v1mc()。这使用随机多播 MAC 地址而不是主机的真实 MAC 地址。


提示:对于testing/debugging,您可以简单地执行SELECT uuid_generate_v1() ;。无需保存到行和检索。