UUIDUtils工具类-根据时间生成UUID
2014-12-15 00:00
309 查看
/* * Copyright (c) 2011-2013 GoPivotal, Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package reactor.util; import java.math.BigInteger; import java.security.SecureRandom; import java.util.Random; import java.util.UUID; import java.util.concurrent.locks.ReentrantLock; /** * Helper for creating random and Type 1 (time-based) UUIDs. * * @author Jon Brisbin */ public abstract class UUIDUtils { private static boolean IS_THREADLOCALRANDOM_AVAILABLE = false; private static Random random; private static final long leastSigBits; private static final ReentrantLock lock = new ReentrantLock(); private static long lastTime; static { try { IS_THREADLOCALRANDOM_AVAILABLE = null != UUIDUtils.class.getClassLoader().loadClass( "java.util.concurrent.ThreadLocalRandom" ); } catch(ClassNotFoundException e) { } byte[] seed = new SecureRandom().generateSeed(8); leastSigBits = new BigInteger(seed).longValue(); if(!IS_THREADLOCALRANDOM_AVAILABLE) { random = new Random(leastSigBits); } } private UUIDUtils() { } /** * Create a new random UUID. * * @return the new UUID */ public static UUID random() { byte[] randomBytes = new byte[16]; if(IS_THREADLOCALRANDOM_AVAILABLE) { java.util.concurrent.ThreadLocalRandom.current().nextBytes(randomBytes); } else { random.nextBytes(randomBytes); } long mostSigBits = 0; for(int i = 0; i < 8; i++) { mostSigBits = (mostSigBits << 8) | (randomBytes[i] & 0xff); } long leastSigBits = 0; for(int i = 8; i < 16; i++) { leastSigBits = (leastSigBits << 8) | (randomBytes[i] & 0xff); } return new UUID(mostSigBits, leastSigBits); } /** * Create a new time-based UUID. * * @return the new UUID */ public static UUID create() { long timeMillis = (System.currentTimeMillis() * 10000) + 0x01B21DD213814000L; lock.lock(); try { if(timeMillis > lastTime) { lastTime = timeMillis; } else { timeMillis = ++lastTime; } } finally { lock.unlock(); } // time low long mostSigBits = timeMillis << 32; // time mid mostSigBits |= (timeMillis & 0xFFFF00000000L) >> 16; // time hi and version mostSigBits |= 0x1000 | ((timeMillis >> 48) & 0x0FFF); // version 1 return new UUID(mostSigBits, leastSigBits); } }
相关文章推荐
- UUIDUtils工具类-根据时间生成UUID
- ASP.net根据时间生成随机文件名
- 根据日期时间和随机量生成唯一ID!!
- java基于时间生成uuid
- javascript根据时间生成m位随机数最大13位
- 小工具(1):项目所需小工具之CommonUtils(1生成uuid,2Map转换成JavaBean)
- 根据时间生成文件名的函数
- js jquery计算时间差与根据时间差生成时间
- Fortran根据系统时间生成随机数
- FreeMarker工具类,用来根据模板文件生成html文件,html字符串等
- 根据进程查找该进行的执行位置和完整执行指令和检查文件开始生成时间
- flex 学习项目中总结的时间处理工具类DateUtils
- java根据时间生成唯一ID
- 反射+注释,根据实体类对象生成SQL语句工具类
- 今天根据别人的代码简单的封装了一个将java bean生成xml的一个工具类,运用了反射和泛型,重用性高。
- 反射+注释,根据实体类对象生成SQL语句工具类
- 根据日期+时间生成唯一编码
- DateTimeUtils 日期时间工具类 (AS3,Flex3)
- 生成本地文件/格式化时间/获取时间差 工具类
- 使用log4j生成动态日志文件-文件名根据时间自动生成