房间号生成
就是说房间号生成问题,房间号其实也是一种密码,如果递增的话会让人很容易猜到其他房间号,明显是不安全的,所以最安全的方式是随机。
但是单纯随机的话当房间比较多的时候,如果排重的话效率明显太低,会出现多次重复的情况,所以我使用在一定时间内随机的办法。
其实就是高位随机,低位自增,自增的序列掩码有12位,高位随机的位置有四位在高位,这样保证从一万多个房间内是绝对唯一,且不用排重的。而且从数字上看不出任何规律。
当序列掩码溢出,则序列掩码重新归零,而当序列掩码重新归零的时候,以当前的产品设计预计的业务量,上次创建的序列掩码为0 的房间早就结束了,并销毁了,一个房间也不允许超过四个小时存在时间,那么在这个业务范围内是可以保证唯一性的,并且高效生成随机,而且不排重。
public synchronized int getId(){
int b = ONEROOM;
if(bm){
if(M==(0x1fff+1)){
M=0;
}
Random t =new Random();
b =0;
int a= t.nextInt(64);
int c= t.nextInt(32);
int d= t.nextInt(16);
int e= t.nextInt(8);
a =a << 13;
c =c << 13;//22
d =d << 13;
e =e << 13;
b =a+c+d+e +M;
if(b==ONEROOM){
b++;
M++;
}
M++;
}else{
bm =true;
}
//System.out.println(b);
return b;
}
这里生成的第一个房间号必然为555553,主要是考虑一个高并发容器SuperMap的一个树的平衡问题