总结上生成UUID需要的各种值

总结下生成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变量中,因为这些数据的存取也是比较耗时间的。