在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非常不错..
Java代码
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 = 0i <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 = 0i <li++) {
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 = 0i <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类库中可以使用UUID方法,来生成唯一的数字的一串数字编号,也就是订单号。UUID.randomUUID().toString().replaceAll("-", "")通过上述方法就可以返回一串数字字符串。