博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
订单号消费码生成(线性同余算法)
阅读量:6264 次
发布时间:2019-06-22

本文共 3800 字,大约阅读时间需要 12 分钟。

hot3.png

    利用线性同余算法生产码,每次从码池中获取订单号。存储利用redis缓存,加快获取效率利用线性同余算法生产码,每次从码池中获取订单号。存储利用redis缓存,加快获取效率。

1 线性同余

    线性同余发生器(Linear congruential generator)是 Xn =(aXn-1 = b) mod m

形式的伪随机序列发生器,其中Xn 是序列的第n个数,Xn-1 是序列的第n-1个数,变量a,b,m是常数,a是乘数,b是增量,m是模,密匙即种子是初始值X0 。
    这种发生器的周期不会超过m。如果a,b和m都是可选的,那么发生器将会是一个最大周期发生器(maximal period generator,有时也叫最大长度),并且周期为m。
(例如,b是与m相关的素数。) 在选择常数是需要仔细,以保证能找到最大的周期。
线性同余发生器的优点是:速度快,每位只需要很少的操作。

2 线性同余生成伪随机数

    程序中,利用线性同余算法生产随机数,具体代码如下:

long c = 7L;long a = 21L;int vs = 50000;public synchronized   void generatorCustomCode(){        String[]values = new String[vs];        for (int i = 0; i < vs; i++) {            value = (a * value + c) % m;            code_value = String.format(fc, value);            values[i] = code_value;        }    }    return setOperations.pop(code + flow);}

3 随机数和盐进行变换

这样每次生成的随机数,即使有重复,加上变换之后,也就不会重复了。

public synchronized   void generatorCustomCode(){        String[]values = new String[vs];        for (int i = 0; i < vs; i++) {            value = (a * value + c) % m;            code_value = String.format(fc, value);            key = String.format(fk, c_value);            if(c_value<1000) {                code_value = code_value.substring(0, 2) + key.substring(0, 1) + code_value.substring(2, 5)                        + key.substring(1, 2) + code_value.substring(5, 8) + key.substring(2) + code_value.substring(8);            }else{                code_value = code_value.substring(0, 2) + key.substring(0, 1) + code_value.substring(2, 5) + key.substring(1, 2) + code_value.substring(5, 8)                        + key.substring(2, 3) + code_value.substring(8, 9)+ key.substring(3) + code_value.substring(9);            }            values[i] = code_value;        }    }    return setOperations.pop(code + flow);}

4 示例

利用该方式生成服务号的示例,完整代码

public synchronized   String generatorCustomCode(){    String code = "mc:ye:order:code:custom:";    String key  = code + "key";    ValueOperations
valueOperations = redisTemplate.opsForValue();    SetOperations
setOperations = redisTemplate.opsForSet();    String flow = (String)valueOperations.get(key);    //初始化KEY    if(flow==null){        flow = "100";        valueOperations.set(key, flow);    }    //初始化原始码池    Long size = setOperations.size(code + flow);    if(size==null||size<=0){        Long startTime = DateUtils.getMillis();        logger.info("消费码码池耗尽,重新生成码开始-------");        valueOperations.increment(key,1);        flow = (String)valueOperations.get(key);        long c_value = Long.valueOf(flow);        long m = 1000000000L;        String fc = "%09d";        String fk = "%03d";        if(c_value >= 1000){            m = 1000000000L;            fc = "%011d";            fk = "%04d";        }        long value = c_value;        String code_value = "";        String[]values = new String[vs];        for (int i = 0; i < vs; i++) {            value = (a * value + c) % m;            code_value = String.format(fc, value);            key = String.format(fk, c_value);            if(c_value<1000) {                code_value = code_value.substring(0, 2) + key.substring(0, 1) + code_value.substring(2, 5)                        + key.substring(1, 2) + code_value.substring(5, 8) + key.substring(2) + code_value.substring(8);            }else{                code_value = code_value.substring(0, 2) + key.substring(0, 1) + code_value.substring(2, 5) + key.substring(1, 2) + code_value.substring(5, 8)                        + key.substring(2, 3) + code_value.substring(8, 9)+ key.substring(3) + code_value.substring(9);            }            values[i] = code_value;        }        batchAdd(code + flow,values);        logger.info("生成消费码,码池生成结束,耗时:{} ms",DateUtils.getMillis()-startTime);    }    return setOperations.pop(code + flow);}

 

转载于:https://my.oschina.net/u/2441175/blog/743638

你可能感兴趣的文章
在线转码
查看>>
我的友情链接
查看>>
励志短句在线翻译的方法介绍
查看>>
博客园美化-coffee
查看>>
Hibernate Annotation 学习
查看>>
Hadoop 3.0 纠删码技术分析(Erasure Coding)
查看>>
11、待添加
查看>>
26、百度地图 & 高德地图
查看>>
MYSQL老密码与php版本扩展关系
查看>>
类型检测汇总!typeof 和 instanceof 和isArray
查看>>
HDU4578 线段树(区间更新 + 多种操作)
查看>>
10g集群启动顺序
查看>>
习水医院12C RAC 数据库安装文档
查看>>
Jmeter常用脚本开发之Junit Request
查看>>
C# 加密–RSA前端与后台的加密&解密
查看>>
reduce/reduceRight
查看>>
(转)(contant的一些用法)
查看>>
Shell 脚本常用命令
查看>>
再次改版轮播图
查看>>
pandas系列 read_excel() 和 to_excel()各参数详解
查看>>