`
teasp
  • 浏览: 61549 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

序列号生成器

阅读更多
/**
 * 生成序列号,最大值为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());
            } 
        } 
    }
    
} 

 

1
6
分享到:
评论

相关推荐

    cod4序列号生成器

    cod4序列号生成器 cod4序列号生成器

    数据库序列号生成器

    数据库序列号生成器是一种工具,通常用于为数据库中的记录生成唯一的标识符,这些标识符可以作为主键,确保数据的唯一性和完整性。在数据库设计中,主键是表中一个或一组字段,其值能够唯一地标识每条记录。序列号...

    Nero Burning Rom 序列号生成器

    然而,"Nero Burning Rom 序列号生成器"涉及的话题较为敏感,因为这可能指的是一个用于生成非法或假冒软件序列号的工具,这违反了软件版权法律。 首先,让我们明确一点:合法使用软件是每个用户的义务,尊重知识...

    虚拟机序列号生成器.

    虚拟机序列号生成器.rar

    易语言序列号生成器

    易语言序列号生成器源码,序列号生成器,十六进制到十进制,十进制到十六进制,序列号显示,序列号算法,序列号反算,读取授权文件,秘密,wvsprintfA,StrToIntExA

    adobe-dreamwear cs4序列号生成器

    【标题】"adobe-dreamwear cs4序列号生成器"所涉及的知识点主要集中在Adobe Dreamweaver CS4这款软件的授权与激活机制上。Adobe Dreamweaver是Adobe公司开发的一款专业级网页设计和开发工具,它融合了视觉设计与代码...

    卡巴斯基序列号生成器

    卡巴斯基序列号生成器

    Steelray Project Viewer序列号生成器

    Steelray Project Viewer序列号生成器noy-steelray.project.viewer.keygen.jar 支持5.0以上版本,其他版本未测试 运行需安装jdk、jre 另,内含多个可用的license

    web storm 序列号生成器

    web storm 序列号生成器, 破解, 支持当前最新的WebStorm3.03, 3.03版本支持NodeJS的开发. 非常好用的JavaScript的开发工具.

    软件序列号生成器.rar

    软件序列号生成器,通取物理地址,实现对MAC地址的绑定。加密好工具。

    虚拟化硬件序列号生成器匿名者 v1.5.zip

    系统硬盘序列号 网卡MAC 主板信息 支持Windows10 1809 1903 1909 2004 20h2 21h1 使用方法就是依次输入1 2 3就行 重启不会自动恢复 : 随机化注册表和重置网卡数据 重启会自动恢复 : 加载匿名驱动 建议配合影子系统...

    Delphi XE5完美破解含序列号生成器

    经过多次尝试和搜索,经本人验证确实可以完美破解Delphi和C++ Builder XE5的破解工具和序列号生成器。

    Balsamiq.Mockups.v2.2.3 包括序列号生成器

    使用序列号生成器违反了软件的许可协议,因为这本质上是逃避了购买授权的必要性。合法使用Balsamiq Mockups应通过官方渠道购买并激活,支持软件开发者的工作。 **3. 命令行运行** 描述中提到了在命令行环境下运行`...

    vmware workstation 10 序列号生成器

    在描述中提到的“vmware workstation 10 序列号生成器”是指一种工具,通常这类工具是非官方的,目的是为了生成可以激活VMware Workstation 10的序列号。然而,值得注意的是,使用这种序列号生成器是违反VMware的...

    汉语大辞典5.87序列号生成器

    完全意义上的 汉语大辞典5.87序列号生成程序,不是程序的破解,真正的注册序列号,一台机器对应很多序列号,选择一个输入即可完美注册

    Myeclipse6.0和Myeclipse6.5序列号生成器

    本文将深入探讨MyEclipse 6.0和6.5版本的序列号生成器相关知识。 首先,我们需要理解软件序列号(Serial Number)的作用。序列号是软件开发商用于验证用户合法性的关键,通常每个软件安装后都需要输入正确的序列号...

    eclipse序列号生成器

    【标题】"eclipse序列号生成器"涉及的是软件授权和Eclipse集成开发环境(IDE)的相关知识。Eclipse是一款开源、跨平台的Java IDE,广泛用于Java应用程序的开发,同时也支持其他编程语言如C++、Python等。然而,这里...

    序列号生成器初级代码

    在IT领域,序列号生成器通常用于软件授权验证,它基于特定算法生成一串唯一标识符,以确保软件只能在合法授权的设备上运行。在这个初级代码项目中,开发者使用了Qt库,一个跨平台的应用程序开发框架,来实现硬件信息...

    vmware14序列号生成器

    VMware是全球云基础架构和移动商务解决方案厂商,提供基于VMware的解决方案,企业通过数据中心改造和公有云整合业务,借助企业安全转型维系客户信任

Global site tag (gtag.js) - Google Analytics