首先,给大家普及知识:
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); }