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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值