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()); } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。