环境
系统平台:银河麒麟(飞腾)U系 V4
版本:4.5
文档用途
客户的源库是MySQL,业务上需要生成唯一的19位的数值,客户之前采用的是雪花算法。雪花算法用到了序列号、时间戳和位运算。
在HGDB中也可以实现雪花算法,通过创建序列,获取时间戳,然后经过位移运算,拼接到一块可以得到一个唯一的19位数值。
详细信息
HGDB中雪花算法的实现方案:
1、创建序列,下面生成id的函数需要
CREATE SEQUENCE table_id_seq increment by 1 maxvalue 99999999 minvalue 1 start 1 cycle;
2、创建雪花算法生成id的函数
CREATE OR REPLACE FUNCTION getbigintid(OUT ret bigint)
returns bigint AS $$
DECLARE
our_epoch bigint := 1314220021721;
seq_id bigint;
now_millis bigint;
shard_id int := 5;
BEGIN
seq_id := nextval('table_id_seq') % 1024;
SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
ret := (now_millis - our_epoch) << 23;
ret := ret | (shard_id << 10);
ret := ret | (seq_id);
END;
$$
LANGUAGE PLPGSQL;
3、测试
① 获取一条记录
② 获取1百万个id,无重复
③ 获取1千万个id,无重复