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