PHP生成订单号的五种方法:时间拼接随机数 混拼字母 减年份转十六进制 雪花算法 拼接时间戳与随机数

第一种:年月日时分秒+拼接随机数   危险 稍微体量一大这种肯定有重复

$danhao = date('YmdHis') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);

第二种:好复杂 直接用随机数代替不香吗

uniqid生成基于毫秒的唯一码 substr截取一部分  str-plit进行转化为数组  array_map转化每个数组元素,implode拼接

$danhao = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);

第三种:ymdhis+随机数+检查码

//生成24位唯一订单号码,
//格式:
//YYYY-MMDD-HHII-SS-NNNN,NNNN-CC,
//YYYY=年份,MM=月份,DD=日期,HH=24格式小时,II=分,SS=秒,
//NNNNNNNN=随机数,CC=检查码

@date_default_timezone_set("PRC");
//订购日期 
$order_date = date('Y-m-d');
 
//订单号码主体(YYYYMMDDHHIISSNNNNNNNN)
$order_id_main = date('YmdHis') . rand(10000000,99999999);
 
//订单号码主体长度
 
$order_id_len = strlen($order_id_main);
 
$order_id_sum = 0;
 
for($i=0; $i<$order_id_len; $i++){
  $order_id_sum += (int)(substr($order_id_main,$i,1)); 
}
 
//唯一订单号码(YYYYMMDDHHIISSNNNNNNNNCC)
$order_id = $order_id_main . str_pad((100 - $order_id_sum % 100) % 100,2,'0',STR_PAD_LEFT);

第四种:混拼字母

dechex十进制转化为十六进制  减去年份因为年份太长了!

<?php 
$yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');
$orderSn = $yCode[intval(date('Y')) - 2011] . strtoupper(dechex(date('m'))) . date('d') . 
substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99));
?>

第五种:雪花算法

基于Twitter的SnowFlake算法的实现,这个算法的好处很简单可以在每秒产生约400W个不同的16位数字ID(10进制)。

原理很简单

ID由64bit组成

其中 第一个bit空缺

41bit用于存放毫秒级时间戳

10bit用于存放机器id

12bit用于存放自增ID

除了最高位bit标记为不可用以外,其余三组bit占位均可浮动,看具体的业务需求而定。默认情况下41bit的时间戳可以支持该算法使用到2082年,10bit的工作机器id可以支持1023台机器,序列号支持1毫秒产生4095个自增序列id。

资源地址:https://github.com/sschiau/Particle

下面是PHP源码

<?php
abstract class Particle {    
    const EPOCH = 1479533469598;    
    const max12bit = 4095;    
    const max41bit = 1099511627775;    
    static $machineId = null;    
    public static function machineId($mId) {    
        self::$machineId = $mId;    
    }    
    public static function generateParticle() {    
        /*    
        * Time - 42 bits    
        */    
        $time = floor(microtime(true) * 1000);    
        /*    
        * Substract custom epoch from current time    
        */    
        $time -= self::EPOCH;    
        /*    
        * Create a base and add time to it    
        */    
        $base = decbin(self::max41bit + $time);    
        /*    
        * Configured machine id - 10 bits - up to 1024 machines    
        */    
        $machineid = str_pad(decbin(self::$machineId), 10, "0", STR_PAD_LEFT);    
        /*    
        * sequence number - 12 bits - up to 4096 random numbers per machine    
        */    
        $random = str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", STR_PAD_LEFT);    
        /*    
        * Pack    
        */    
        $base = $base.$machineid.$random;    
        /*    
        * Return unique time id no    
        */    
        return bindec($base);    
    }    
    public static function timeFromParticle($particle) {    
        /*    
        * Return time    
        */    
        return bindec(substr(decbin($particle),0,41)) - self::max41bit + self::EPOCH;    
    }    
}
 
$machineID = 0; // Machine ID (aka Server ID no.)
$res = Particle::generateParticle($machineID);
print_r($res);

第六种:项目中用到的

$time = time();
$orderCode = '60' . time() . rand(11111111, 99999999);

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值