同心圆"/>
分布式id探索:同心圆
分布式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");
- id = xx_decimalFormat + yy_decimalFormat ;即:id的位数为22位。
- r2区间 : [100000000,2147483647(即int最大值:2^31-1)],
- x区间:[1000.00000d,9999.99999d] ,跳跃值d = 0.00001d; 所以一个圆可以产生999999999个坐标。
经估算:即使每天一台机器半径r2增加100次, 部署30台,一年半径增加:1098000,使用100年半径增加109800000。(2147483647 - 100000000 = 2047483647) >>> 109800000 ,
以上仅是理论值。当然我们可以寻找最优的参数值。以上理论如果不对,请及时指正。欢迎留言讨论。
更多推荐
分布式id探索:同心圆
发布评论