/** * 生成序列号,最大值为MAX_VAL。如果达到MAX_VAL,从0开始。 */ public class SerialGenerator { public static final int MAX_VAL = 999; public static final int R_NUM = getRNum(MAX_VAL); private static AtomicReference<AtomicInteger> ref = new AtomicReference<AtomicInteger>(new AtomicInteger(0)); public static int getSerialNo() { AtomicInteger old = ref.get(); int serialNo = old.getAndIncrement(); while (serialNo > MAX_VAL) { AtomicInteger update = new AtomicInteger(0); ref.compareAndSet(old, update); old = ref.get(); serialNo = old.getAndIncrement(); } return serialNo; } /** * 求整数有几位,如234是3位。 * @param i * @return */ private static final int getRNum(int i) { if (i < 0) { throw new RuntimeException("Illegal arg i, i=" + i); } int div = i; int num = 1; div /= 10; while (div > 0) { div /= 10; num++; } return num; } /** * 获取序列号,该序列号为字符串表示,长度固定为序列号的最大长度, * 如果长度不足,则在前面补0,比如"015" * @return */ public static String getSerialNoInStr() { int serialNo = getSerialNo(); int rnum = getRNum(serialNo); StringBuilder sb = new StringBuilder(); for (int i=0; i<R_NUM-rnum; i++) { sb.append("0"); } return sb.append(serialNo).toString(); } @Test public static void main(String[] args) throws InterruptedException, ExecutionException { //测10次 for (int t=0; t<10; t++) { int taskNum = 1 + new Random().nextInt(19); @SuppressWarnings("unchecked") Future<Integer>[] fs = new Future[taskNum]; // System.err.println(taskNum); ExecutorService executor = Executors.newFixedThreadPool(taskNum); for (int i=0; i<taskNum; i++) { fs[i] = executor.submit(new Callable<Integer>() { int sum = 0; @Override public Integer call() throws Exception { for (int i=0; i<=MAX_VAL; i++) { sum += getSerialNo(); } return new Integer(sum); } }); } int result = 0; for (Future<Integer> future : fs) { result += future.get(); } int expect = 0; for (int i=0; i<taskNum; i++) { for (int j=0; j<=MAX_VAL; j++) { expect += j; } } Assert.assertEquals(expect, result); System.out.println(taskNum + " : " + expect); } Random random = new Random(); for (int i=0; i<10000; i++) { getSerialNoInStr(); if (random.nextInt(1000) < 9) { System.out.println(getSerialNoInStr()); } } } }
相关推荐
cod4序列号生成器 cod4序列号生成器
数据库序列号生成器是一种工具,通常用于为数据库中的记录生成唯一的标识符,这些标识符可以作为主键,确保数据的唯一性和完整性。在数据库设计中,主键是表中一个或一组字段,其值能够唯一地标识每条记录。序列号...
然而,"Nero Burning Rom 序列号生成器"涉及的话题较为敏感,因为这可能指的是一个用于生成非法或假冒软件序列号的工具,这违反了软件版权法律。 首先,让我们明确一点:合法使用软件是每个用户的义务,尊重知识...
虚拟机序列号生成器.rar
易语言序列号生成器源码,序列号生成器,十六进制到十进制,十进制到十六进制,序列号显示,序列号算法,序列号反算,读取授权文件,秘密,wvsprintfA,StrToIntExA
【标题】"adobe-dreamwear cs4序列号生成器"所涉及的知识点主要集中在Adobe Dreamweaver CS4这款软件的授权与激活机制上。Adobe Dreamweaver是Adobe公司开发的一款专业级网页设计和开发工具,它融合了视觉设计与代码...
卡巴斯基序列号生成器
Steelray Project Viewer序列号生成器noy-steelray.project.viewer.keygen.jar 支持5.0以上版本,其他版本未测试 运行需安装jdk、jre 另,内含多个可用的license
web storm 序列号生成器, 破解, 支持当前最新的WebStorm3.03, 3.03版本支持NodeJS的开发. 非常好用的JavaScript的开发工具.
软件序列号生成器,通取物理地址,实现对MAC地址的绑定。加密好工具。
系统硬盘序列号 网卡MAC 主板信息 支持Windows10 1809 1903 1909 2004 20h2 21h1 使用方法就是依次输入1 2 3就行 重启不会自动恢复 : 随机化注册表和重置网卡数据 重启会自动恢复 : 加载匿名驱动 建议配合影子系统...
经过多次尝试和搜索,经本人验证确实可以完美破解Delphi和C++ Builder XE5的破解工具和序列号生成器。
使用序列号生成器违反了软件的许可协议,因为这本质上是逃避了购买授权的必要性。合法使用Balsamiq Mockups应通过官方渠道购买并激活,支持软件开发者的工作。 **3. 命令行运行** 描述中提到了在命令行环境下运行`...
在描述中提到的“vmware workstation 10 序列号生成器”是指一种工具,通常这类工具是非官方的,目的是为了生成可以激活VMware Workstation 10的序列号。然而,值得注意的是,使用这种序列号生成器是违反VMware的...
完全意义上的 汉语大辞典5.87序列号生成程序,不是程序的破解,真正的注册序列号,一台机器对应很多序列号,选择一个输入即可完美注册
本文将深入探讨MyEclipse 6.0和6.5版本的序列号生成器相关知识。 首先,我们需要理解软件序列号(Serial Number)的作用。序列号是软件开发商用于验证用户合法性的关键,通常每个软件安装后都需要输入正确的序列号...
【标题】"eclipse序列号生成器"涉及的是软件授权和Eclipse集成开发环境(IDE)的相关知识。Eclipse是一款开源、跨平台的Java IDE,广泛用于Java应用程序的开发,同时也支持其他编程语言如C++、Python等。然而,这里...
在IT领域,序列号生成器通常用于软件授权验证,它基于特定算法生成一串唯一标识符,以确保软件只能在合法授权的设备上运行。在这个初级代码项目中,开发者使用了Qt库,一个跨平台的应用程序开发框架,来实现硬件信息...
VMware是全球云基础架构和移动商务解决方案厂商,提供基于VMware的解决方案,企业通过数据中心改造和公有云整合业务,借助企业安全转型维系客户信任