分布式id探索:同心圆

编程入门 行业动态 更新时间:2024-10-11 01:20:47

分布式id探索:<a href=https://www.elefans.com/category/jswz/34/1696685.html style=同心圆"/>

分布式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");

  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 ,

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

更多推荐

分布式id探索:同心圆

本文发布于:2024-02-24 21:18:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1696686.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:同心圆   分布式   id

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!