总结下生成UUID需要的各种值
有的时候需要自己生成UUID,同时这个UUID还具有一些业务相关性,例如机器属性,用户id属性等,所以这个uuid就需要我们自己来构造了。一般构造UUID都希望是全局唯一的,不管是单机还是分布式环境下,那么为了构造这个唯一的业务性UUID我们可以利用的特征值有哪些呢?
?
一:主机的host
?
String host = InetAddress.getLocalHost().getHostAddress();
? 如果没有配置过host 有可能得到的host是回环地址 127.0.0.1
?
二:主机的mac
?
Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();while(nis.hasMoreElements()) {NetworkInterface ni = nis.nextElement();byte mac[] = ni.getHardwareAddress(); String macHex = DatatypeConverter.printHexBinary(mac);}
?我这里没有用到自己写的任何类,DatatypeConverter也是jdk自带的 用于将byte转换到16进制的字符串格式,这个可以参见我之前的一篇文章
?
这里需要注意,当安装了多个虚拟网卡时,该选择哪一个,我是没找到特别好的方法可以选取物理网卡的
?
三:当前启动的进程id
?
String pid =ManagementFactory.getRuntimeMXBean().getName();
?这里需要说明的是 pid构成方式为? pid@hostname? 例如我得到的值是 117004@dikar ,你需要截取第一个为pid
?
四:精确到纳秒的时间
?
long time = System.nanoTime();
?提醒如果不需要这么细,可以到 currentTimeMillis
?也许有人认为上面这些已经足够了,其实在多线程高并发下,nanotime相同的多的是,而且这个精度实际没那么准确,所以还需要第5个来保证唯一性
?
五:原子性的计数器
?
AtomicLong count = new AtomicLong(-Long.MAX_VALUE);long counter = count.incrementAndGet();
?为了防止数据过大造成long的溢出,所以初始化使用了负得maxLong
?
特别提醒,针对只需要一次性获取的值,例如host mac pid等。这个可以存放进static变量中,因为这些数据的存取也是比较耗时间的。