读书人

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

发布时间: 2012-12-18 12:43:41 作者: rapoo

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

读书人网 >编程

热点推荐