分布式id探索:同心圆

博客探讨了使用同心圆特性生成分布式ID的方法。通过实验展示了即使微小的x坐标变化也会导致y坐标的不同,确保了ID的独特性。文章讨论了决定圆坐标参数、x值的初始和跳跃差、半径大小以及ID长度等关键问题,并提供了实验参数示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分布式id探索:同心圆。

同心圆特性:

1.众所周知,同心圆有天然的隔离,没有交点。所以在分布式机器中是相互隔离,可独立运行。

2.微观角度,半径不同的同心圆,x坐标即使一样,y的坐标也会有细小差异(只要精度够,y的差异也是可以体现出来)。

3.在同一个圆上,每个区间理论上有无数的数可以供我们使用。

大胆假设:基于以上判断,将x与y的坐标组成一个字符串(id = x+y),应该是不会重复。

圆心为(0,0)的圆的坐标是 x2+y2=r2;

实验:分别取r2 = 1000000000,1000000001, 1000000003

x分别取值:1000.00000,1000.00001,1000.00002,1000.00003, 1000.00004计算出3组不同的结果,可以看到:

1.即使x增加0.00001的值,y在同一半径都是有差异的(如:31606.96125856,31606.96125824)。

2.x不变,半径每次增加1,y值有4位精度不同(如:31606.96125856,31606.96127438, 31606.96129020

(1000.00000,31606.96125856)
(1000.00001,31606.96125824)
(1000.00002,31606.96125793)
(1000.00003,31606.96125761)
(1000.00004,31606.96125729)


(1000.00000,31606.96127438)
(1000.00001,31606.96127406)
(1000.00002,31606.96127374)
(1000.00003,31606.96127343)
(1000.00004,31606.96127311)


(1000.00000,31606.96129020)
(1000.00001,31606.96128988)
(1000.00002,31606.96128956)
(1000.00003,31606.96128925)
(1000.00004,31606.96128893)

private static final DecimalFormat xx_decimalFormat = new DecimalFormat("0000.00000");

private static final DecimalFormat yy_decimalFormat = new DecimalFormat("00000.00000000"); 
   
public static void main(String[] args) {
        Set<String> set =  new HashSet();
        for (int r2 = 1000000000;r2<1000500000;r2++){
            double x = 1000.00000d;
            for (int i=0; i<5; i++){
                double y  = Math.sqrt(r2 - Math.pow(x, 2));
                String xx = xx_decimalFormat.format(x);
                String yy  = yy_decimalFormat.format(y);
                set.add(xx + yy);
                System.out.println("("+xx +","+ yy+")");
                x = x + 0.00001;
            }
        }
        //可以看到set的大小2500000,说明没有重复的
       System.out.println("总数量:"+set.size());
}

基于以上实验,影响圆坐标参数:x2+y2=r2,结合实际生产要解决一下问题:

1.y的精度取多少位;

2.x值的初始值,及跳跃差(上面实验x = x+0.00001)如何取,可以保证y的精度,且在同一半径下有足够多的坐标点(取决x的区间,即产生的id数量 = max(x)/跳跃值 );

3.x与y的偏离度不会太大(x = 0000.00000, y= 00000.00000000 ,x影响y的长度:这里,仅相差1位)。

4.半径r的大小,及id的长度(不可过长);

这里给下我们实验采用的一些参数值:

private static final DecimalFormat xx_decimalFormat = new DecimalFormat("0000.00000");

private static final DecimalFormat yy_decimalFormat = new DecimalFormat("00000.00000000");

  1. id = xx_decimalFormat + yy_decimalFormat ;即:id的位数为22位。
  2. r2区间 : [100000000,2147483647(即int最大值:2^31-1)], 
  3. x区间:[1000.00000d,9999.99999d] ,跳跃值d =  0.00001d; 所以一个圆可以产生999999999个坐标。

经估算:即使每天一台机器半径r2增加100次, 部署30台,一年半径增加:1098000,使用100年半径增加109800000。(2147483647 - 100000000 = 2047483647) >>> 109800000 ,

以上仅是理论值。当然我们可以寻找最优的参数值。以上理论如果不对,请及时指正。欢迎留言讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值