F.44. uuid-ossp #
uuid-ossp 模块提供一些函数,可使用几种标准算法之一生成通用唯一标识符(UUID)。它还提供一些函数,用于生成某些特殊的 UUID 常量。
F.44.1. uuid-ossp 函数
表 F.32 显示了可用于生成 UUID 的函数。相关标准 ITU-T Rec. X.667、ISO/IEC 9834-8:2005 和 RFC 4122 规定了生成 UUID 的四种算法,由版本号 1、3、4 和 5 标识。(不存在版本 2 算法。)每种算法可能适用于不同的一组应用。
表 F.32. 用于生成 UUID 的函数
| 函数 | 描述 |
|---|---|
uuid_generate_v1() |
此函数生成第 1 版 UUID。这需要使用计算机的 MAC 地址和时间戳。请注意,这类 UUID 会泄露创建该标识符的计算机身份及创建时间,因此可能不适合某些对安全敏感的应用。 |
uuid_generate_v1mc() |
此函数生成第 1 版 UUID,但使用随机多播 MAC 地址,而不是计算机的真实 MAC 地址。 |
uuid_generate_v3(namespace uuid, name text) |
此函数在给定命名空间中使用指定输入名称生成第 3 版 UUID。命名空间应是表 F.33 中所示 例如: SELECT uuid_generate_v3(uuid_ns_url(), 'http://www.postgresql.org'); 名称参数会先做 MD5 hash,因此无法从生成的 UUID 中反推出明文内容。通过这种方法生成 UUID 不包含随机因素,也不依赖于环境,因此结果可重现。 |
uuid_generate_v4() |
此函数生成第 4 版 UUID,它完全由随机数派生。 |
uuid_generate_v5(namespace uuid, name text) |
此函数生成第 5 版 UUID,其工作方式类似于第 3 版 UUID,但使用 SHA-1 作为 hash 方法。由于 SHA-1 被认为比 MD5 更安全,应优先使用第 5 版而不是第 3 版。 |
表 F.33. 返回 UUID 常量的函数
uuid_nil() |
一个“nil” UUID 常量,不会作为真实 UUID 出现。 |
uuid_ns_dns() |
指定 UUID 的 DNS 命名空间的常量。 |
uuid_ns_url() |
指定 UUID 的 URL 命名空间的常量。 |
uuid_ns_oid() |
指定 UUID 的 ISO 对象标识符(OID)命名空间的常量。(这涉及 ASN.1 OID,与 PostgreSQL 使用的 OID 无关。) |
uuid_ns_x500() |
指定 UUID 的 X.500 可辨识名称(DN)命名空间的常量。 |
F.44.2. 构建 uuid-ossp
历史上,此模块依赖 OSSP UUID 库,这也是该模块名称的由来。虽然在 http://www.ossp.org/pkg/lib/uuid/仍然可以找到 OSSP UUID 库,但它维护得并不好,而且移植到较新的平台上正变得越来越困难。如今,在某些平台上,uuid-ossp 已可在不依赖 OSSP 库的情况下构建。在 FreeBSD 和其他一些 BSD 派生平台上,合适的 UUID 生成功能包含在核心
libc 库中。在 Linux、macOS 和其他一些平台上,相应功能由 libuuid 库提供,该库最初来自
e2fsprogs 项目(不过在现代 Linux 上,它被视为
util-linux-ng 的一部分)。调用 configure 时,可指定
--with-uuid=bsd 以使用 BSD 函数,或指定 --with-uuid=e2fs 以使用
e2fsprogs 的 libuuid,或指定 --with-uuid=ossp 以使用 OSSP UUID 库。某台机器上可能同时具备多个这样的库,因此 configure 不会自动选择其一。
注意
如果只需要随机生成的(第 4 版)UUID,可以考虑改用 pgcrypto 模块中的 gen_random_uuid() 函数。
F.44.3. 作者
Peter Eisentraut <peter_e@gmx.net>