From f434d88f292d0fc87f71e385f79bc63f16339548 Mon Sep 17 00:00:00 2001 From: xinian Date: Sun, 1 Mar 2026 01:26:49 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E8=BE=91=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E9=9A=8F=E6=9C=BAid=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- help/随机id生成 | 58 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/help/随机id生成 b/help/随机id生成 index c99d43bce..68c88e854 100644 --- a/help/随机id生成 +++ b/help/随机id生成 @@ -1,39 +1,57 @@ --- 先恢复 +-- 清理旧的 ALTER TABLE base_sys_user ALTER COLUMN id SET DEFAULT nextval('base_sys_user_id_seq'); +DROP FUNCTION IF EXISTS shuffle_9digit() CASCADE; -DROP FUNCTION IF EXISTS next_8digit_shuffle_id() CASCADE; - --- 8位自增 → 洗牌 → 仍然8位 → 绝对不重复 -CREATE OR REPLACE FUNCTION next_8digit_shuffle_id() +-- 9位乱序:首尾互换 + 中间全部打乱 +-- 纯数字换位,100% 不重复,速度极快 +CREATE OR REPLACE FUNCTION shuffle_9digit() RETURNS bigint LANGUAGE plpgsql VOLATILE AS $$ DECLARE - seq bigint; - a int; - b int; + seq bigint; + d0 int; -- 原最后一位 + d1 int; + d2 int; + d3 int; + d4 int; + d5 int; + d6 int; + d7 int; -- 原第一位 BEGIN - seq := nextval('base_sys_user_id_seq'); + seq := nextval('base_sys_user_id_seq'); -- 8位自增 - -- 把 8 位数字拆开洗牌 - a := (seq / 10000)::int; -- 前4位 - b := (seq % 10000)::int; -- 后4位 + -- 拆分 8 位:d7 d6 d5 d4 d3 d2 d1 d0 + d7 := (seq / 10000000) % 10; + d6 := (seq / 1000000) % 10; + d5 := (seq / 100000) % 10; + d4 := (seq / 10000) % 10; + d3 := (seq / 1000) % 10; + d2 := (seq / 100) % 10; + d1 := (seq / 10) % 10; + d0 := seq % 10; - -- 前后互换 + 简单扰乱,保证: - -- 1. 还是8位 - -- 2. seq 不同 → 结果一定不同 - return ((b * 9871) % 10000) * 10000 - + ((a * 1237) % 10000); + -- 构造成 9 位,规则: + -- 1. 首尾互换(原最后一位放第1位,原第1位放最后) + -- 2. 中间全部打乱位置 + RETURN + d0 * 100000000 + -- 原最后一位 → 第1位 + d3 * 10000000 + + d1 * 1000000 + + d5 * 100000 + + d2 * 10000 + + d6 * 1000 + + d4 * 100 + + d7 * 10 + + d0; -- 原第一位 → 第9位 END; $$; -- 启用 ALTER TABLE base_sys_user -ALTER COLUMN id SET DEFAULT next_8digit_shuffle_id(); - - +ALTER COLUMN id SET DEFAULT shuffle_9digit(); ALTER TABLE base_sys_user