`
haierboos
  • 浏览: 439033 次
文章分类
社区版块
存档分类
最新评论

两种方法利用Java生成唯一ID,取当前时间与字母随机组合,并发少的情况足以胜任

 
阅读更多

自己写的,利用当前的时间字符串与字母的随机组合成16位ID。如果并发不是太多,完成可以胜任。就算并发很多也不容易重复

import java.util.Random;

public class UniqueId{
	public static void main(String[] args) {
		Long h = System.currentTimeMillis();//获得当前时间的毫秒数
		String str = h.toString();//转化为字符串
		int i = str.length();
		int j = i-7;//用来取此字符串的末尾7位数,因为前面的数是年份什么的基本不变,我们只用后面的7位
		String body = str.substring(j, j+3);//取此字符串的末尾7位数的前3位
		String tail = str.substring(j+3,i);//取此字符串的末尾7位数的后4位
		//将26位字母做成数组,你也可以添加一些其它的可用字符
		String [] arr = {"a", "b", "c", "d","e", "f", "g", 
					"h","i","g", "k", "l","m", "n", 
					"o", "p","q", "r", "s", "t",
					"u", "v", "w", "x","y", "z"};

		String[] target = new String[3];
		//将字母数组随机取3个字母组成一个字符串,一共组成3个字符串放到目标数组target中
			for(int s = 0; s<3;s++){
				Random random = new Random();
		         int a = random.nextInt(arr.length);
		         int b = random.nextInt(arr.length);
		         int c = random.nextInt(arr.length);
		         target[s] = arr[a]+arr[b]+arr[c];
		       }
		System.out.println(target[0]+body+target[1]+tail+target[2]);//将3个字母段与两个数字段组合输出随机ID
	}

}

后来觉得并不是太好就又写了一个随机组合16位ID。貌似下面这个更好些

import java.util.Random;

public class SeeId{
	public static void main(String[] args) {
		Long h = System.currentTimeMillis();//获得当前时间的毫秒数
		String str = h.toString();//转化为字符串
		int i = str.length();//总长度
		int j = i-7;//用来取此字符串的末尾7位数,因为前面的数是年份什么的基本不变,我们只用后面的7位
		char[] charArray = str.substring(j,i).toCharArray();//将取到的7位数做成数组
		//将26位字母做成数组
		String [] arr = {"a", "b", "c", "d","e", "f", "g", 
					"h","i","g", "k", "l","m", "n", 
					"o", "p","q", "r", "s", "t",
					"u", "v", "w", "x","y", "z"};
		//将字母数组随机取3个字母组成一个字符串,一共组成3个字符串放到目标数组target中
		StringBuffer uniqueId = new StringBuffer();//用于生成唯一ID
		Random random = new Random();//用于取随机数和布尔值
		boolean insertflag = true;//用来控制是插入数字还是字母
		int timecount = 0;//用来控制插入数字的长度,别超过7
		int zimucount = 0;//用来控制插入字母的总数,别超过9 7个数字加上9个字母组合
		boolean timeflag = true;//判断时间是否插入了7位,默认true为不满
		boolean zimuflag = true;//判断字幕是否插入了9位,默认true为不满
		while (zimucount<9||timecount<7) {//开始组合
			if(insertflag){//默认为ture,先加字母,你也可以先加数字
				if (zimucount<9) {//如果uniqueId插入的字幕总数没超过9个
					uniqueId.append(arr[random.nextInt(26)]);//则在字母数组中随机选一个插入
					zimucount++;//对应加1
					if(timeflag){//如果时间没有插入满7位则重新抓阄看插入时间还是数字
					insertflag = random.nextBoolean();//重置flag,随机产生false还是true
					}//如果timeflag=false,时间数字已经插入满7位,则不抓阄了。保持insertflag=true
				}else{//如果已经加够了否则不操作,
					zimuflag = false;//将zimuflag变为已加够,false
					insertflag = false;//将插入权判断给时间数字
				}
			}else{
				if (timecount<7) {//先加时间转化成的数组,你也可以先加字母
					//此处取时间数字数组不能用random随机取。那样用时间来生成数组就没意义了
					uniqueId.append(charArray[timecount]);//不可打乱顺序
					timecount++;//对应加1
					if(zimuflag){//如果字母没有插入满9位则重新抓阄看插入时间还是数字
						insertflag = random.nextBoolean();
					}//如果zimuflag=false,字幕已经插入满9位,则不抓阄了。保持insertflag=false
				}else{
					timeflag = false;//将timeflag变为已加够,false
					insertflag = true;//将插入权判断给字母
				}
			}
		}
		System.out.println(uniqueId.toString());//得到最终id
	}
}

也算抛砖引玉,有更好的方法欢迎提出。感觉已经满够用的了微笑

 

 

分享到:
评论

相关推荐

    JAVA版本的生成唯一编号

    /** * 获得序列号,同时更新持久化存储中的序列 * @param current 当前的日期 * @param start 初始化的序号 * @return 所获得新的序列号 */ protected abstract int getOrUpdateNumber(Date current, int start);

    Springboot唯一编号整合,vesta全局唯一id生成器

    适用于Java分布式高并发的全局唯一ID生成器;结合Springboot和SpringCloud

    Java系统的高并发解决方法详解

    主要介绍了Java系统的高并发解决方法,内容十分丰富,在这里分享给大家,需要的朋友可以参考。

    JAVA生成订单号(日期+流水号)

    java按日期加流水号方式生成订单号,已经测试过,可递增方式生成。

    java随机产生四位验证码(相邻码不重复)两种算法实现

    1.生成四位字符、整数组成的验证码(无重复码验证) package week1; import java.util.Random; import org.omg.IOP.Codec; public class doWhile{ public static void main(String[] args){ for(int k=0;k;k++)...

    java并发编程与实践

    java并发编程与实践是java高并发的分析文档,分析并介绍了高并发的解决方案。

    Java并发编程实战

    5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6 构建高效且可伸缩的结果缓存 第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1...

    java并发编程时间 java_concurrency_in_practice

    java并发编程时间 java_concurrency_in_practice

    java并发编程2

    java并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf

    Java 并发核心编程

    自从java创建以来就已经支持并发的理念,如线程和锁。这篇指南主要是为帮助java多线程开发人员理解并发的核心概念以及如何应用这些理念。本文的主题是关于具有java语言风格的Thread、synchronized、volatile,以及...

    Java 模拟线程并发

    Java 模拟线程并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发

    java-uniqueid:唯一的ID生成器,专门处理小型ID

    该库的两个基本前提是: 每个生成标识符的进程都必须声明或分配一个代表其生成器ID的编号,并将其合并到它生成的标识符中生成标识符的每个进程都必须使其时钟同步,并且必须将当前时间戳纳入其生成的标识符中进程每...

    Java高并发编程,构建并发编程知识体系,提升面试成功率

    带你掌握多线程并发编程(线程安全,线程调度,线程封闭,同步容器等)与高并发处理思路与手段(扩容,缓存,队列,拆分等),构建完整的并发与高并发知识体系,胜任实际开发中并发与高并发问题的处理,倍增高薪面试...

    PHP Snowflake(雪花算法)生成唯一ID值

    最近项目需要解决高并发分布式生成唯一ID值的问题,经过考虑,采用Snowflake算法,该算法是一个很有效的办法,具体的可以自己百度,这里是基于thinkPHP5 开发的通用的生成器,其实也是参考了网上的方法,只是增加了...

    SQL server高并发下生成唯一订单号的存储过程

    这个是用SQL server写的存储过程,搭配里面一张数据表使用,达到高并发情况下获得唯一订单号的目的;原理:按照一定规则生成订单号后,把订单号插入数据表后,再返回给用户,由于数据表设置了主键,也就是当数据表中...

    java web在高并发和分布式下实现订单号生成唯一的解决方案

    主要介绍了java web在高并发和分布式下实现订单号生成唯一的解决方案,需要的朋友可以参考下

    java并发编程艺术

    java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术

    JAVA并发编程实践 .pdf

    介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务...

    java并发编程实战源码,java并发编程实战pdf,Java

    java并发编程实战源码 附有本书所有源码,maven 导入 eclipse或idea

    java高并发系统设计

    java高并发系统设计

Global site tag (gtag.js) - Google Analytics