JAVA生成短8位UUID的实例讲解
短8位UUID思想其实借鉴微博短域名的生成方式,但是其重复概率过高,而且每次生成4个,需要随即选取一个。
本算法利用62个可打印字符,通过随机生成32位UUID,由于UUID都为十六进制,所以将UUID分成8组,每4个为一组,然后通过模62操作,结果作为索引取出字符,
这样重复率大大降低。
经测试,在生成一千万个数据也没有出现重复,完全满足大部分需求。代码贴出来供大家参考。
publicstaticString[]chars=newString[]{"a","b","c","d","e","f",
"g","h","i","j","k","l","m","n","o","p","q","r","s",
"t","u","v","w","x","y","z","0","1","2","3","4","5",
"6","7","8","9","A","B","C","D","E","F","G","H","I",
"J","K","L","M","N","O","P","Q","R","S","T","U","V",
"W","X","Y","Z"};
publicstaticStringgenerateShortUuid(){
StringBuffershortBuffer=newStringBuffer();
Stringuuid=UUID.randomUUID().toString().replace("-","");
for(inti=0;i<8;i++){
Stringstr=uuid.substring(i*4,i*4+4);
intx=Integer.parseInt(str,16);
shortBuffer.append(chars[x%0x3E]);
}
returnshortBuffer.toString();
}
补充:生成8/16/32位的UUID
我就废话不多说了,大家还是直接看实例吧~
importjava.util.UUID;
publicclassTestUUID{
//得到16位的UUID-(数字)
publicstaticStringgetUUID_16(){
intmachineId=1;//最大支持1-9个集群机器部署
inthashCodeV=UUID.randomUUID().toString().hashCode();
if(hashCodeV<0){//有可能是负数
hashCodeV=-hashCodeV;
}
Stringstring=machineId+String.format("%015d",hashCodeV);
returnstring;
}
//得到32位的UUID-(数字)
publicstaticStringgetUUID_32(){
returnUUID.randomUUID().toString().replace("-","").toLowerCase();
}
//得到8位的UUID-(码)
publicstaticString[]chars=newString[]{"a","b","c","d","e","f","g","h","i","j","k","l","m","n",
"o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8",
"9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z"};
publicstaticStringgetUUID_8(){
StringBuffershortBuffer=newStringBuffer();
Stringuuid=UUID.randomUUID().toString().replace("-","");
for(inti=0;i<8;i++){
Stringstr=uuid.substring(i*4,i*4+4);
intx=Integer.parseInt(str,16);
shortBuffer.append(chars[x%0x3E]);
}
returnshortBuffer.toString();
}
publicstaticvoidmain(String[]args){
System.out.println(getUUID_8());
}
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。