java唯一ID生成
有时我们不依赖于数据库中自动递增的字段产生唯一ID,比如多表同一字段需要统一一个唯一ID,这时就需要用程序来生成一个唯一的全局ID,然后在数据库事务中同时插入到多章表中实现同步.
在java中有个类工具很好的实现产生唯一ID(UUID),但是由数字和字母及中划线组成的,故数据库字段应该设置为char 并相应的建立索引.
UUID是128位整数(16字节)的全局唯一标识符(Universally Unique Identifier).
指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成UUID的API.UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址,纳秒级时间,芯片ID码和许多可能的数字.由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个 UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长.关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers).
在ColdFusion中可以用CreateUUID()函数很简单的生成UUID,其格式为:xxxxxxxx- xxxx-xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字.而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
,可以从cflib 下载CreateGUID() UDF进行转换.
使用UUID的好处在分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显.
关于UUID的更多信息可以多google 一下.
Java生成UUID
UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址,纳秒级时间,芯片ID码和许多可能的数字.由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长.
在Java中生成UUID主要有以下几种方式:
JDK1.5
如果使用的JDK1.5的话,那么生成UUID变成了一件简单的事,以为JDK实现了UUID:
java.util.UUID, 直接调用即可.
UUID uuid = UUID.randomUUID();
String s = UUID.randomUUID().toString();//用来生成数据库的主键id非常不错..
- package com.taobao.tddl.client.util;
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import java.net.InetAddress;
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import java.security.SecureRandom;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.Random;
- import java.util.concurrent.atomic.AtomicLong;
- import java.util.concurrent.locks.ReentrantLock;
- /**
- * @author huangshang
- *
- */
- public class UniqId {
- private static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7',
- '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
- private static Map<Character, Integer> rDigits = new HashMap<Character, Integer>(
- 16);
- static {
- for (int i = 0; i < digits.length; ++i) {
- rDigits.put(digits[i], i);
- }
- }
- private static UniqId me = new UniqId();
- private String hostAddr;
- private Random random = new SecureRandom();
- private MessageDigest mHasher;
- private UniqTimer timer = new UniqTimer();
- private ReentrantLock opLock = new ReentrantLock();
- private UniqId() {
- try {
- InetAddress addr = InetAddress.getLocalHost();
- hostAddr = addr.getHostAddress();
- } catch (IOException e) {
- hostAddr = String.valueOf(System.currentTimeMillis());
- }
- if (hostAddr == null || hostAddr.length() == 0
- || "127.0.0.1".equals(hostAddr)) {
- hostAddr = String.valueOf(System.currentTimeMillis());
- }
- try {
- mHasher = MessageDigest.getInstance("MD5");
- } catch (NoSuchAlgorithmException nex) {
- mHasher = null;
- }
- }
- /**
- * 获取UniqID实例
- *
- * @return UniqId
- */
- public static UniqId getInstance() {
- return me;
- }
- /**
- * 获得不会重复的毫秒数
- *
- * @return
- */
- public long getUniqTime() {
- return timer.getCurrentTime();
- }
- /**
- * 获得UniqId
- *
- * @return uniqTime-randomNum-hostAddr-threadId
- */
- public String getUniqID() {
- StringBuffer sb = new StringBuffer();
- long t = timer.getCurrentTime();
- sb.append(t);
- sb.append("-");
- sb.append(random.nextInt(8999) + 1000);
- sb.append("-");
- sb.append(hostAddr);
- sb.append("-");
- sb.append(Thread.currentThread().hashCode());
- return sb.toString();
- }
- /**
- * 获取MD5之后的uniqId string
- *
- * @return uniqId md5 string
- */
- public String getUniqIDHashString() {
- return hashString(getUniqID());
- }
- /**
- * 获取MD5之后的uniqId
- *
- * @return byte[16]
- */
- public byte[] getUniqIDHash() {
- return hash(getUniqID());
- }
- /**
- * 对字符串进行md5
- *
- * @param str
- * @return md5 byte[16]
- */
- public byte[] hash(String str) {
- opLock.lock();
- try {
- byte[] bt = mHasher.digest(str.getBytes("UTF-8"));
- if (null == bt || bt.length != 16) {
- throw new IllegalArgumentException("md5 need");
- }
- return bt;
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException("unsupported utf-8 encoding", e);
- } finally {
- opLock.unlock();
- }
- }
- /**
- * 对二进制数据进行md5
- *
- * @param str
- * @return md5 byte[16]
- */
- public byte[] hash(byte[] data) {
- opLock.lock();
- try {
- byte[] bt = mHasher.digest(data);
- if (null == bt || bt.length != 16) {
- throw new IllegalArgumentException("md5 need");
- }
- return bt;
- } finally {
- opLock.unlock();
- }
- }
- /**
- * 对字符串进行md5 string
- *
- * @param str
- * @return md5 string
- */
- public String hashString(String str) {
- byte[] bt = hash(str);
- return bytes2string(bt);
- }
- /**
- * 对字节流进行md5 string
- *
- * @param str
- * @return md5 string
- */
- public String hashBytes(byte[] str) {
- byte[] bt = hash(str);
- return bytes2string(bt);
- }
- /**
- * 将一个字节数组转化为可见的字符串
- *
- * @param bt
- * @return
- */
- public String bytes2string(byte[] bt) {
- int l = bt.length;
- char[] out = new char[l << 1];
- for (int i = 0, j = 0; i < l; i++) {
- out[j++] = digits[(0xF0 & bt[i]) >>> 4];
- out[j++] = digits[0x0F & bt[i]];
- }
- return new String(out);
- }
- /**
- * 将字符串转换为bytes
- *
- * @param str
- * @return byte[]
- */
- public byte[] string2bytes(String str) {
- if (null == str) {
- throw new NullPointerException("参数不能为空");
- }
- if (str.length() != 32) {
- throw new IllegalArgumentException("字符串长度必须是32");
- }
- byte[] data = new byte[16];
- char[] chs = str.toCharArray();
- for (int i = 0; i < 16; ++i) {
- int h = rDigits.get(chs[i * 2]).intValue();
- int l = rDigits.get(chs[i * 2 + 1]).intValue();
- data[i] = (byte) ((h & 0x0F) << 4 | (l & 0x0F));
- }
- return data;
- }
- /**
- * 实现不重复的时间
- *
- * @author dogun
- */
- private static class UniqTimer {
- private AtomicLong lastTime = new AtomicLong(System.currentTimeMillis());
- public long getCurrentTime() {
- return this.lastTime.incrementAndGet();
- }
- }
- }
java唯一ID生成的更多相关文章
- 关于全局唯一ID生成方法
引:最近业务开发过程中需要涉及到全局唯一ID生成.之前零零总总的收集过一些相关资料,特此整理以便后用 本博客已经迁移至:http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...
- 【系统设计】分布式唯一ID生成方案总结
目录 分布式系统中唯一ID生成方案 1. 唯一ID简介 2. 全局ID常见生成方案 2.1 UUID生成 2.2 数据库生成 2.3 Redis生成 2.4 利用zookeeper生成 2.5 雪花算 ...
- 分布式系统唯一ID生成方案
分布式系统唯一ID生成方案汇总 数据库自增主键 最常见的方式.利用数据库,全数据库唯一. 优点: 1)简单,代码方便,性能可以接受. 2)数字ID天然排序,对分页或者需要排序的结果很有帮助. 缺点: ...
- 开源项目|Go 开发的一款分布式唯一 ID 生成系统
原文连接: 开源项目|Go 开发的一款分布式唯一 ID 生成系统 今天跟大家介绍一个开源项目:id-maker,主要功能是用来在分布式环境下生成唯一 ID.上周停更了一周,也是用来开发和测试这个项目的 ...
- 分布式唯一ID生成服务
SNService是一款基于分布式的唯一ID生成服务,主要用于提供大数量业务数据建立唯一ID的需要;服务提供最低10K/s的唯一ID请求处理.如果你部署服务的CPU资源达到4核的情况下那该服务最低可以 ...
- 分布式系统的唯一id生成算法你了解吗?
在分库分表之后你必然要面对的一个问题,就是id咋生成? 因为要是一个表分成多个表之后,每个表的id都是从1开始累加自增长,那肯定不对啊. 举个例子,你的订单表拆分为了1024张订单表,每个表的id都从 ...
- 分布式系统唯一ID生成方案汇总【转】
转自:http://www.cnblogs.com/haoxinyue/p/5208136.html 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很 ...
- 分布式唯一ID生成算法-雪花算法
在我们的工作中,数据库某些表的字段会用到唯一的,趋势递增的订单编号,我们将介绍两种方法,一种是传统的采用随机数生成的方式,另外一种是采用当前比较流行的“分布式唯一ID生成算法-雪花算法”来实现. 一. ...
- (4.24)【mysql、sql server】分布式全局唯一ID生成方案
参考:分布式全局唯一ID生成方案:https://blog.csdn.net/linzhiqiang0316/article/details/80425437 分表生成唯一ID方案 sql serve ...
随机推荐
- JS中的弹窗问题confirm和prompt
JavaScript-确认(confirm 消息对话框) confirm 消息对话框通常用于允许用户做选择的动作,如:“你对吗?”等.弹出对话框(包括一个确定按钮和一个取消按钮). 语法: confi ...
- DOCTYPE的作用以及标准模式和兼容模式的区别
<!doctype>声明必须处于HTML文档的头部,在<html>标签之前,告知浏览器的解析器用什么文档标准解析这个文档.DOCTYPE不存在或格式不正确会导致文档以兼容模式呈 ...
- 虚拟机镜像压缩(qcow2,raw)
●qcow2 格式的压缩首先,需要对虚拟机系统的剩余空间写零操作: $ dd if=/dev/zero of=/zero.dat 删除 zero.dat$ rm /zero.dat关闭虚拟机,进入虚拟 ...
- Within K stops 最短路径 Cheapest Flights Within K Stops
2018-09-19 22:34:28 问题描述: 问题求解: 本题是典型的最短路径的扩展题,可以使用Bellman Ford算法进行求解,需要注意的是在Bellman Ford算法的时候需要额外申请 ...
- Java Spring JDBC访问数据库
一.首先采用org.springframework.jdbc.datasource.DriverManagerDataSource类进行实现 1.applicationContext.xml配置如下: ...
- 2018-02-16 GetSameTypeQuestion
'目前存在的BUG '图片补丁存在多个URL Private Declare Function URLDownloadToFile Lib "urlmon" Alias " ...
- Spring Batch @EnableBatchIntegration 注解
设置一个远程分块任务需要定义一系列的 beans: 一个连接工程来从消息中间件中获得连接,消息中间件包括有(JMS,AMQP 和其他) 一个 MessagingTemplate 来从主向从发送消息, ...
- MySQL事务(二)
一.事务的隔离级别/锁问题 基本的介绍: 当我们的mysql表,被多个线程或者客户端同时操作时,mysql提供一种机制,可以让不同的事务在操作数据时,具有隔离性. 锁是计算机协调多个进程或线程并发访问 ...
- 【洛谷p1031】均分纸牌
[博客园的第一条随笔,值得纪念一下] 均分纸牌[传送门] 洛谷上的算法标签是 这道题是一道贪心题,过了四遍才过(蒟蒻有点废) 第一遍的时候考虑的非常少,只想到了求出平均数→求差值→从左往右加差值: 这 ...
- leetcode-algorithms-4 Median of Two Sorted Arrays
leetcode-algorithms-4 Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of siz ...