关于棋牌手游,高效生成随机房间ID问题

房间号生成
就是说房间号生成问题,房间号其实也是一种密码,如果递增的话会让人很容易猜到其他房间号,明显是不安全的,所以最安全的方式是随机。
但是单纯随机的话当房间比较多的时候,如果排重的话效率明显太低,会出现多次重复的情况,所以我使用在一定时间内随机的办法。
其实就是高位随机,低位自增,自增的序列掩码有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的一个树的平衡问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值