首页 > 解决方案 > 在 Postgres 中生成少于 12 位的有序、定时、唯一、JSON 安全 ID

问题描述

我不想使用 UUID,因为它太长而且不是很友好,也不是整数,因为只能对单个表是唯一的,并且最终会泄露相关信息。所以经过大量阅读,我发现一篇文章提出了一个非常有趣的 Postgres 中唯一 ID 的解决方案。基本上功能是:

create sequence global_id_sequence;

CREATE OR REPLACE FUNCTION id_generator(OUT result bigint) AS $$
DECLARE
    our_epoch bigint := 1314220021721;
    seq_id bigint;
    now_millis bigint;
BEGIN
    SELECT nextval('global_id_sequence') % 1024 INTO seq_id;

    SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
    result := (now_millis - our_epoch) << 23;
    result := result | (shard_id << 10);
    result := result | (seq_id);
END;
$$ LANGUAGE PLPGSQL;

SELECT id_generator();

这很好用,但它会生成一个 17-19 digit BigInt。这在后端本身不是问题,但是在处理大量 JSON 数据时,在某些情况下 Javascript 16 位限制开始让人头疼。

我见过 Shopify 唯一 ID 大约 10-12 位,我认为这将是完美的:“唯一”、有序、基于时间,如果需要,可以跨多个表、模式和服务器使用,并且相对人性化,但我无法理解如何保持此特性并从此功能中修剪 5-7 位数字。

我尝试更改参数,如 de 模块、乘法因子和其他所有参数,但它似乎只适用于一组特定的参数。

有任何想法吗?

标签: jsonpostgresqluuid

解决方案


推荐阅读