如何生成没有破折号的 uuid

Posted

技术标签:

【中文标题】如何生成没有破折号的 uuid【英文标题】:How to generate uuids without dashes 【发布时间】:2016-11-21 16:17:22 【问题描述】:

我正在创建一个具有以下表定义的表

CREATE TABLE auth(
    id                  UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    role                VARCHAR(64)
);

生成的 uuid 格式为 a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 我知道 postgres 也接受不带连字符的 uuid。我们如何指定自动生成的 uuid 中没有连字符?

【问题讨论】:

UUID 数据类型不包含破折号。只有当您显示数据时才会显示破折号。类似于没有格式的 DATE。 哇!我可以使用不带连字符的 uuid 进行查询! 手册中有详细记录:postgresql.org/docs/current/static/datatype-uuid.html Postgres 支持不同的 'format uuid 版本。除此之外,各种格式的使用评估相同(即 '`a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11':: uuid = 'a0eebc999c0b4ef8bb6d-6bb9bd380a11::uuid' 评估为 TRUE。但在生成时它总是在 带有破折号的标准格式。请参阅Documentation。要消除破折号,将 uuid 列转换为文本,然后使用替换删除:replace(::text, '-','')跨度> 【参考方案1】:

这是一个可行的解决方案,可以实现接近您所要求的目标:

CREATE TABLE foo (
  ts TIMESTAMP WITH TIME ZONE,
  uuid VARCHAR DEFAULT REPLACE(uuid_generate_v4()::text, '-', '' )
); 

INSERT INTO foo ( ts ) VALUES ( now() );

但是(它是一个大但是)在这里我们将uuid 转换为string,这意味着索引本身将比数字或真实的uuid 贵得多.

在这篇文章中你可以找到一个很好的解释:https://tomharrisonjr.com/uuid-or-guid-as-primary-keys-be-careful-7b2aa3dcb439


据我所知,Postgres 的uuid 使用连字符,即使您尝试删除它们:

CREATE TABLE foo (
  ts TIMESTAMP WITH TIME ZONE,
  queue UUID DEFAULT REPLACE(uuid_generate_v4()::text, '-', '' )::uuid,
);

INSERT INTO foo ( ts ) VALUES ( now() );

上面的例子在 Postgres 9.6 中工作得很好,但是当我们转换回 uuid 时,连字符会被添加回来。

【讨论】:

连字符存储在列中。它们仅在您显示值时生成。

以上是关于如何生成没有破折号的 uuid的主要内容,如果未能解决你的问题,请参考以下文章

如何验证使用 base64UUID 生成的 UUID

java uuid 最大能生成多少条?

bat中如何批量生成向uuid的唯一标识的文件名?

bat中如何批量生成向uuid的唯一标识的文件名?

如何生成 pubnub UUID?

如何在jquery中生成uuid