首先,给大家普及知识:
UUID是一个由4个连字号(-)将32个字节长的字符串分隔后生成的字符串,总共36个字节长。比如:550e8400-e29b-41d4-a716-446655440000
http://www.baike.com/wiki/UUID
GUID 是微软对UUID这个标准的实现。UUID是由开放软件基金会(OSF)定义的。UUID还有其它各种实现,不止GUID一种。比如我们这里在Java中、Oracle中用到的。
http://www.baike.com/wiki/GUID
COMB(combine)型是数据库特有的一种设计思想,可以理解为一种改进的GUID,它通过组合GUID和系统时间,以使其在索引和检索事有更优的性能。
数据库中没有COMB类型,它是Jimmy Nilsson在他的“The Cost of GUIDs as Primary Keys”一文中设计出来的。COMB数据类型的基本设计思路是这样的:既然UniqueIdentifier数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么我们能不能通过组合的方式,保留UniqueIdentifier的前10个字节,用后6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与UniqueIdentifier组合起来,在保留UniqueIdentifier的唯一性的同时增加了有序性,以此来提高索引效率。
http://blog.csdn.net/happyflystone/article/details/1903854
下边总结下,我们生产编码的CUID代码:
/**
* 生成指定类型的25位编码
* @param cuidType 编码类型
* @return String
* @throws Exception
*/
private synchronized static String generateCuid(String cuidType) throws Exception {
int max_hash_len = 16;
StringBuffer cuidBuffer = new StringBuffer();
Random random = new Random();
// 第1位 类型,比如A、B、C
cuidBuffer.append(cuidType);
// 第2位 到 第 5位 随机大写字母
for (int i = 0; i < 4; ++i)
cuidBuffer.append("ABCDEFGHIJKLMNOPQRSTUVWXYZ".charAt(random.nextInt("ABCDEFGHIJKLMNOPQRSTUVWXYZ".length())));
long hashCode = UUID.randomUUID().hashCode();
// 第6位 到 第 14/15位 使用UUID的hashcode得到0-9的9位或10位数
cuidBuffer.append(hashCode < 0 ? -hashCode : hashCode);
// 第10/11位 正数补0 负数补1
cuidBuffer.append(hashCode > 0 ? "0" : "1");
// 用0补足16位
if (cuidBuffer.length() < max_hash_len)
for (int i = 0; i < max_hash_len - cuidBuffer.length(); i++)
cuidBuffer.append("0");
// 用当前时分秒 补足最后9位 一共25位(1位类型字母+4位大写字母+20位随机数字)
cuidBuffer.append(new SimpleDateFormat("HHmmssSSS").format(new Date()));
return cuidBuffer.toString();
}
调用方法:
try {
String aCode = generateCuid("A");
System.out.println(aCode);
System.out.println(aCode.length());
} catch (Exception e) {
Log.error("生成A类型编码失败", e);
}