UUID
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。比如jdk提供了java.util.UUID工具类为我们生成需要的UUID。来看下UUID基本的方法。
//随机生成UUID,可做主键 UUID uuid = UUID.randomUUID(); String strUuid = "32209534-f01d-4b8d-b268-65be4ce42a3e"; // 根据符合格式的字符串生成UUID UUID uuid2 = UUID.fromString(strUuid); //输出低32位(官方不是这么解释的,这是个人看法) System.out.println(uuid2.getLeastSignificantBits()); //输出高32位(官方不是这么解释的,这是个人看法) System.out.println(uuid2.getMostSignificantBits());
Base64格式的UUID
UUID占据36位。而基于Base64格式的UUID占据22位,采取52个大小写的英文字母,9个数字,以及+和/一共64个字符。Base64相当于使用64进制来表示数据,相同长度位数的情况下要比16进制表示更多的内容。
由于UUID标准数据总共是128-bit,所以我们就可以对这个128-bit重新进行Base64编码。128-bit的UUID在Java中表示为两个long型数据,可以采用java.util.UUID中的getLeastSignificantBits与getMostSignificantBits分别获得两个long(64-bit)。再通过Base64转码就可以获得我们所要的UUID。
public void base64UuidTest(){ UUID uuid = UUID.randomUUID(); byte[] byUuid = new byte[16]; // 获取高低位为long类型 long least = uuid.getLeastSignificantBits(); long most = uuid.getMostSignificantBits(); // long转字节 for(int i=0;i<8;i++){ //long64位 获取偏移量 int offset = 64-(i+1)*8; byUuid[i] |=(byte)(least>>offset&0xff); } for(int i=8;i<16;i++){ //long64位,获取偏移量 int offset = 64-(i+1)*8; byUuid[i] |=(byte)(most>>offset&0xff); } // 调用Base64编码返回uuid字符串 String base64Uuid = Base64.getEncoder().encodeToString(byUuid); System.out.println(base64Uuid); }
Base58格式的UUID
上面也说到了,基于Base64编码的UUID存在特殊字符 * 和/,尤其是/对于web端传输数据存在很大的问题。于是项目中用到了22位的Base58的UUID。Base58采用的字符集合为“123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ”,从这不难看出,Base58是纯数字与字母组成而且去掉了容易引起视觉混淆的字符(0:数字零,O:大写O,I:大写i,l:小写L)。9个数字+49个字母=58个。由于没有特殊字符所以在采用鼠标双击或移动设备选择时可以自动识别全选。
//代码整理中,敬请期待
未完待续。
有着十分的好奇心的,先看这篇博客。
https://my.oschina.net/noahxiao/blog/155828