UUIDUtils工具类-根据时间生成UUID
2014-03-06 15:25
579 查看
/* * 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
- oracle根据时间对数据进行统计每天生成的量
- js jquery计算时间差与根据时间差生成时间
- 根据Android Layout XM文件自动生成自定义View代码的工具类
- python根据时间生成mongodb的ObjectId的方法
- UUID生成工具类
- 根据SVN距给定时间之后提交的文件进行增量部署Java工具类
- 项目经验:通过uuid生成工具类自动生成32位uuid
- C# DateTime.ToString根据不同语言生成相应的时间格式
- 根据时间随机生成12位数字,且不重复2015-8-21
- 根据时间随机数生成随机文件名 ,SpringMVC 上传文件
- 时间工具类详细说明 DateUtils
- Fortran根据系统时间生成随机数
- flex 学习项目中总结的时间处理工具类DateUtils
- impala保存时间类型timestamp---NanoTimeUtils根据JdateTime生成nanotime
- c#根据当前系统时间生成的随机序列数
- 根据日期时间和随机量生成唯一ID!!
- Java 常用工具类(11) : UUID生成工具类
- 根据开始时间结束时间,开始的经纬度结束的经纬度,按照一定的时间频率生成坐标点。
- java基于时间生成uuid