观看视频
基本原理:由4部份组成一个64字节的整数(bigint).
select (2199023255551::bigint) / (24::bigint * 60 * 60 * 1000) / 365
select (((1::bigint)<<43) - 1) / (24::bigint * 60 * 60 * 1000) / 365
select (((1::bigint)<<12) - 1)
要设置bit位的任一1位为0时,将该位设置为0,其它位设置为1,然后执行&运算.例如将第7位设置为0
select (32767::bit(16)) & x'FF7F'
-- 32767二进制表示为 01111111 11111111
-- FF7F二进制表示为 11111111 01111111
-- 结果 01111111 01111111
要设置bit位的任一1位为1时,将该位设置为1,其它位设置为0,然后执行|运算.例如将第7位设置为1
select (0::bit(16)) & x'0080'
-- 0二进制表示为 00000000 00000000
-- 0080二进制表示为 00000000 10000000
-- 结果 00000000 10000000
select
id>>22,
((id<<41)&9223372036854775807)>>53,
((id<<51)&9223372036854775807)>>51
from (select (((2199023255551::bigint)<<22) | (1023<<12) | 4095 ) as id) as tmp
--9223372036854775807的二进制
0111111111111111111111111111111111111111111111111111111111111111
在使用分布式程序时,此时同一毫秒内同一台机器只会产生很少量的序列号,因此可以将工作机器id扩充至12位、14位、16位,序列号使用10位、8位、6位.具体如何选择请结合需求.
select
id>>22,
((id<<41)&9223372036854775807)>>51,
((id<<53)&9223372036854775807)>>53
from (select (((2199023255551::bigint)<<22) | (4095<<10) | 1023 ) as id) as tmp
select
id>>22,
((id<<41)&9223372036854775807)>>49,
((id<<55)&9223372036854775807)>>55
from (select (((2199023255551::bigint)<<22) | (16383<<8) | 2 ) as id) as tmp
select
id>>22,
((id<<41)&9223372036854775807)>>47,
((id<<57)&9223372036854775807)>>57
from (select (((2199023255551::bigint)<<22) | (65535<<6) | 63 ) as id) as tmp