json - 在 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 模块、乘法因子和其他所有参数,但它似乎只适用于一组特定的参数。
有任何想法吗?
解决方案
推荐阅读
- python - 如何在不重复的文件夹之间遍历和匹配多个二维数组?(Python)
- c - C程序计算抢占式SJF调度的所有时间不起作用
- flutter - 如何在同一个小部件中创建可扩展的动态线性列表和可扩展的网格列表?
- java - Java 中的点对点通信
- python - Python 中的 Azure 数据传输 API
- node.js - 带有纱线运行构建系统的 Volta 找不到指定的路径
- java - Spring Initalizr - Intellij 的自定义项目设置
- ruby-on-rails - Rails 6 控制器测试失败:expect(CreatesProject).to have_received(:new).with({name: "Runway", task_string: "start something:2"})
- php - 购物车商品的自定义价格未根据货币 Magento 2 转换
- smalltalk - 在 Pharo Smalltalk 中初始化类变量