import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; /** * 功能: 以秒为单位生成唯一的序列号 <br/> * 生成格式:YYMMddHHmmssXXXXXXX <br/> * XXXXXXX:代表序列号,从1开始 * 例子: 1808312321280000001 或者 1808312321280001234 <br/> * <p>局限性: 每秒生成最大范围 (1000万-1) 个数</p> * Created by Administrator on 2018/8/31. */ public final class GenerateDateTimeUniqueID { // private static final DateFormat DF = new SimpleDateFormat("yyMMddHHmmss"); private static final ThreadLocal<DateFormat> DATE_FORMAT_THREAD_LOCAL = new ThreadLocal<DateFormat>(){ @Override protected DateFormat initialValue() { return new SimpleDateFormat("yyMMddHHmmss"); } }; private static volatile long LAST_TIME = -1; private static final AtomicInteger COUNT = new AtomicInteger(); //测试是否有生成重复的ID public static final ConcurrentMap<String, Boolean> MAP = new ConcurrentHashMap<String, Boolean>(); /******* * * 测试机器系统参数: Win7 64位 i5-4210M 4core 2.6GHz 内存8GB * * ********/ /** * 测试10个线程并发产生,每秒可以产生500万左右个序列号 * * */ public static long generateDateTimeUniqueId() { Date date = new Date(); String dateStr = DATE_FORMAT_THREAD_LOCAL.get().format(date); // String dateStr = DF.format(date); long curTime = Long.parseLong(dateStr); int curCount = 0; synchronized (GenerateDateTimeUniqueID.class) { if (curTime < LAST_TIME) { curTime = LAST_TIME; } else if (curTime > LAST_TIME) { LAST_TIME = curTime; System.out.println(Thread.currentThread().getName() + "-" + COUNT.get()); COUNT.set(0); } curCount = COUNT.incrementAndGet(); } return curTime * 10000000 + curCount; } private GenerateDateTimeUniqueID() { } public static void main(String[] args) { //测试 int num = 10; ExecutorService executorService = Executors.newFixedThreadPool(num); for (int i = 0; i < num; i++) { executorService.submit(new TestThread()); } } static class TestThread implements Runnable { @Override public void run() { while (true) { try { generateDateTimeUniqueId(); // System.out.println(generateDateTimeUniqueId()); } catch (Exception e) { e.printStackTrace(); System.exit(0); } } } } }
相关推荐
根据电脑硬件信息生成唯一的序列号,不依赖于任何第三方组件,包括:硬盘的卷标号、硬盘ID、CPU的序列号、网卡硬件地址、IP地址、登录用户名、计算机名、PC类型、物理内存。
用 STM32 唯一序列号进行程序的加密保护算法。
C#自动生成序列号 源码,让你可以实现控制系列号的自动生成功能,而且格式固定。
分布式架构系统生成全局唯一序列号的一些思路对比分析 分布式架构系统生成全局唯一序列号的一些思路对比分析
用于重新生成MyEclipse5.5序列号
以诚支票打印 3.60 逆向 + 序列号生成以诚支票打印 3.60 逆向 + 序列号生成
利用网卡生成全球唯一序列号,环境VC2010,绝对可用,对于自己软件需要客户注册才能用的同学有极大帮助。自己已经用在了实际的工程里面。不愿独享,特与大家分享。
实现了程序安装的序列号模拟生成,通过C++MFC简单的实现
这是一个软件序列号生成小算法,VC实现,根据硬盘序列号产生唯一对应序列号 抛砖引玉而已
1.VB.NET 2008开发环境的工程文件,纯API方法获取硬盘物理序列号,也就是所谓全球唯一标识的号,通常用这个号作为软件注册的唯一标识;写到一个函数中,非常方便移植代码! 2.使用说明:打开程序后,点按钮后,三个...
Python自动生成二维码信息序列号。 编码格式:SBD 零部件代码 + 控制盒序列号 + 控制盒厂家 例如:[)>06P725-18428S24031410001ZJL SBD 零部件代码:[)>06P725-1842 控制盒序列号:S24031410001 (格式:年月日(S...
根据硬盘的物理序列号和CPU的序列号生成唯一的注册码.zip
eclipse序列号生成器,方便大家在使用eclipse的时间生成序列号用。
js生成Guid序列号
cod4序列号生成器 cod4序列号生成器
卡巴斯基序列号生成器
PB生成硬盘序列号 方便软件加密 每个硬盘序列号都不一样
Delphi随机生成程序序列号..rar
获取硬盘序列号生成软件注册码,保护作者劳动成果。
分布式架构系统生成全局唯一序列号的一些思路对比分析对比文档,适合初中级开发人员查看学习