由于需要一个全局id生成器,要求稳定性,趋势递增,又不想用网上那些复杂的方案,单机解决,并发不是非常高
故写了个简易版,基本满足目前的需求
id构成:约40位微秒时间+约23位随机二级制
(现在时间20180320,微秒长度40位,100年之后大约53位)
public classIDGenerator {
privateRandomrandom=newRandom();
/**
* 19位Long数字
*@return
*/
public longgenerate() {
//时间因子,时间单位:微秒,现在40位,100年之后最大53位(纳秒现在50位,100年之后需要62位)
String tsBits = Long.toUnsignedString(System.nanoTime()/1000,2);
//随机补全63位低位
inttsBitsPreLen =63-tsBits.length();
StringBuilder stringBuilder =newStringBuilder("");
for(inti=;i
stringBuilder.append(random.nextInt(2));
}
String afterTsBits = stringBuilder.toString();
returnLong.parseUnsignedLong(String.format("%s%s", tsBits,afterTsBits),2);
}
}
问题:
由于时间长度会增加,故碰撞的概率会越来越大,在短暂几年内还行;
依赖服务器时钟同步;
领取专属 10元无门槛券
私享最新 技术干货