【2015工作总结】- 编码生成规则

首先,给大家普及知识:

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);
		}

 

猜你喜欢

转载自ily.iteye.com/blog/2269781
今日推荐